tcheck.c revision 1.1.1.3.2.1 1 1.1 mrg /* Test file for mpfr_check.
2 1.1 mrg
3 1.1.1.3.2.1 pgoyette Copyright 2003-2004, 2006-2018 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1 mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include "mpfr-test.h"
24 1.1 mrg
25 1.1.1.3.2.1 pgoyette #define PRINT_ERROR(s) \
26 1.1.1.2 mrg (printf ("mpfr_check failed " s " Prec=%lu\n", (unsigned long) pr), \
27 1.1.1.2 mrg exit(1))
28 1.1 mrg
29 1.1 mrg int
30 1.1 mrg main (void)
31 1.1 mrg {
32 1.1 mrg mpfr_t a;
33 1.1 mrg mp_limb_t *p, tmp;
34 1.1 mrg mp_size_t s;
35 1.1 mrg mpfr_prec_t pr;
36 1.1 mrg int max;
37 1.1 mrg
38 1.1 mrg tests_start_mpfr ();
39 1.1.1.3.2.1 pgoyette for (pr = MPFR_PREC_MIN ; pr < 500 ; pr++)
40 1.1 mrg {
41 1.1 mrg mpfr_init2 (a, pr);
42 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
43 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for init");
44 1.1 mrg /* Check special cases */
45 1.1.1.3.2.1 pgoyette MPFR_SET_NAN (a);
46 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
47 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for nan");
48 1.1.1.3.2.1 pgoyette MPFR_SET_POS (a);
49 1.1.1.3.2.1 pgoyette MPFR_SET_INF (a);
50 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
51 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for inf");
52 1.1.1.3.2.1 pgoyette MPFR_SET_ZERO (a);
53 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
54 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for zero");
55 1.1.1.3.2.1 pgoyette MPFR_EXP (a) = MPFR_EXP_MIN;
56 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
57 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for EXP = MPFR_EXP_MIN");
58 1.1 mrg /* Check var */
59 1.1.1.3.2.1 pgoyette mpfr_set_ui (a, 2, MPFR_RNDN);
60 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
61 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for set_ui");
62 1.1.1.3.2.1 pgoyette mpfr_clear_overflow ();
63 1.1 mrg max = 1000; /* Allows max 2^1000 bits for the exponent */
64 1.1.1.3.2.1 pgoyette while (!mpfr_overflow_p () && max > 0)
65 1.1 mrg {
66 1.1.1.3.2.1 pgoyette mpfr_mul (a, a, a, MPFR_RNDN);
67 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
68 1.1.1.3.2.1 pgoyette PRINT_ERROR ("for mul");
69 1.1 mrg max--;
70 1.1 mrg }
71 1.1.1.3.2.1 pgoyette if (max == 0)
72 1.1.1.3.2.1 pgoyette PRINT_ERROR ("can't reach overflow");
73 1.1.1.3.2.1 pgoyette mpfr_set_ui (a, 2137, MPFR_RNDN);
74 1.1 mrg /* Corrupt a and check for it */
75 1.1.1.3.2.1 pgoyette MPFR_SIGN (a) = 2;
76 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
77 1.1.1.3.2.1 pgoyette PRINT_ERROR ("sgn");
78 1.1.1.3.2.1 pgoyette MPFR_SET_POS (a);
79 1.1 mrg /* Check prec */
80 1.1.1.3.2.1 pgoyette MPFR_PREC (a) = MPFR_PREC_MIN - 1;
81 1.1.1.3.2.1 pgoyette if (mpfr_check (a)) PRINT_ERROR ("precmin");
82 1.1 mrg #if MPFR_VERSION_MAJOR < 3
83 1.1 mrg /* Disable the test with MPFR >= 3 since mpfr_prec_t is now signed.
84 1.1 mrg The "if" below is sufficient, but the MPFR_PREC_MAX+1 generates
85 1.1 mrg a warning with GCC 4.4.4 even though the test is always false. */
86 1.1 mrg if ((mpfr_prec_t) 0 - 1 > 0)
87 1.1 mrg {
88 1.1.1.3.2.1 pgoyette MPFR_PREC (a) = MPFR_PREC_MAX + 1;
89 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
90 1.1.1.3.2.1 pgoyette PRINT_ERROR ("precmax");
91 1.1 mrg }
92 1.1 mrg #endif
93 1.1.1.3.2.1 pgoyette MPFR_PREC (a) = pr;
94 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
95 1.1.1.3.2.1 pgoyette PRINT_ERROR ("prec");
96 1.1 mrg /* Check exponent */
97 1.1.1.3.2.1 pgoyette MPFR_EXP (a) = MPFR_EXP_INVALID;
98 1.1.1.3.2.1 pgoyette if (mpfr_check(a))
99 1.1.1.3.2.1 pgoyette PRINT_ERROR ("exp invalid");
100 1.1.1.3.2.1 pgoyette MPFR_EXP (a) = -MPFR_EXP_INVALID;
101 1.1.1.3.2.1 pgoyette if (mpfr_check(a))
102 1.1.1.3.2.1 pgoyette PRINT_ERROR ("-exp invalid");
103 1.1 mrg MPFR_EXP(a) = 0;
104 1.1.1.3.2.1 pgoyette if (!mpfr_check(a)) PRINT_ERROR ("exp 0");
105 1.1 mrg /* Check Mantissa */
106 1.1 mrg p = MPFR_MANT(a);
107 1.1.1.3.2.1 pgoyette MPFR_MANT (a) = NULL;
108 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
109 1.1.1.3.2.1 pgoyette PRINT_ERROR ("Mantissa Null Ptr");
110 1.1.1.3.2.1 pgoyette MPFR_MANT (a) = p;
111 1.1 mrg /* Check size */
112 1.1.1.3.2.1 pgoyette s = MPFR_GET_ALLOC_SIZE (a);
113 1.1.1.3.2.1 pgoyette MPFR_SET_ALLOC_SIZE (a, 0);
114 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
115 1.1.1.3.2.1 pgoyette PRINT_ERROR ("0 size");
116 1.1.1.3.2.1 pgoyette MPFR_SET_ALLOC_SIZE (a, MP_SIZE_T_MIN);
117 1.1.1.3.2.1 pgoyette if (mpfr_check (a)) PRINT_ERROR ("min size");
118 1.1.1.3.2.1 pgoyette MPFR_SET_ALLOC_SIZE (a, MPFR_LIMB_SIZE (a) - 1);
119 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
120 1.1.1.3.2.1 pgoyette PRINT_ERROR ("size < prec");
121 1.1.1.3.2.1 pgoyette MPFR_SET_ALLOC_SIZE (a, s);
122 1.1 mrg /* Check normal form */
123 1.1.1.3.2.1 pgoyette tmp = MPFR_MANT (a)[0];
124 1.1 mrg if ((pr % GMP_NUMB_BITS) != 0)
125 1.1 mrg {
126 1.1.1.3.2.1 pgoyette MPFR_MANT(a)[0] = MPFR_LIMB_MAX;
127 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
128 1.1.1.3.2.1 pgoyette PRINT_ERROR ("last bits non 0");
129 1.1 mrg }
130 1.1 mrg MPFR_MANT(a)[0] = tmp;
131 1.1 mrg MPFR_MANT(a)[MPFR_LIMB_SIZE(a)-1] &= MPFR_LIMB_MASK (GMP_NUMB_BITS-1);
132 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
133 1.1.1.3.2.1 pgoyette PRINT_ERROR ("last bits non 0");
134 1.1 mrg /* Final */
135 1.1.1.3.2.1 pgoyette mpfr_set_ui (a, 2137, MPFR_RNDN);
136 1.1.1.3.2.1 pgoyette if (!mpfr_check (a))
137 1.1.1.3.2.1 pgoyette PRINT_ERROR ("after last set");
138 1.1 mrg mpfr_clear (a);
139 1.1.1.3.2.1 pgoyette if (mpfr_check (a))
140 1.1.1.3.2.1 pgoyette PRINT_ERROR ("after clear");
141 1.1 mrg }
142 1.1 mrg tests_end_mpfr ();
143 1.1 mrg return 0;
144 1.1 mrg }
145