1 /* Test file for mpfr_cmpabs and mpfr_cmpabs_ui. 2 3 Copyright 2004-2020 Free Software Foundation, Inc. 4 Contributed by the AriC and Caramba projects, INRIA. 5 6 This file is part of the GNU MPFR Library. 7 8 The GNU MPFR Library is free software; you can redistribute it and/or modify 9 it under the terms of the GNU Lesser General Public License as published by 10 the Free Software Foundation; either version 3 of the License, or (at your 11 option) any later version. 12 13 The GNU MPFR Library is distributed in the hope that it will be useful, but 14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16 License for more details. 17 18 You should have received a copy of the GNU Lesser General Public License 19 along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20 https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 21 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23 #include "mpfr-test.h" 24 25 #define PRINT_ERROR(s) do { printf ("Error: %s\n", s); exit (1); } while (0) 26 27 static int 28 cmpabs (mpfr_srcptr x, mpfr_srcptr y) 29 { 30 unsigned int i; 31 int r[4]; 32 mpfr_flags_t f1, f2, flags[2] = { 0, MPFR_FLAGS_ALL }; 33 mpfr_exp_t emin, emax; 34 35 emin = mpfr_get_emin (); 36 emax = mpfr_get_emax (); 37 38 for (i = 0; i < 4; i++) 39 { 40 if (i & 2) 41 { 42 mpfr_exp_t ex = MPFR_IS_SINGULAR (x) ? emax : MPFR_GET_EXP (x); 43 mpfr_exp_t ey = MPFR_IS_SINGULAR (y) ? emax : MPFR_GET_EXP (y); 44 set_emin (ex < ey ? ex : ey); 45 set_emax (ex < ey ? ey : ex); 46 } 47 48 __gmpfr_flags = f1 = flags[i % 2]; 49 r[i] = mpfr_cmpabs (x, y); 50 f2 = __gmpfr_flags; 51 if (MPFR_IS_NAN (x) || MPFR_IS_NAN (y)) 52 f1 |= MPFR_FLAGS_ERANGE; 53 54 if (i & 2) 55 { 56 set_emin (emin); 57 set_emax (emax); 58 } 59 60 if (f1 != f2) 61 { 62 printf ("Flags error in mpfr_cmpabs for i = %u\n x = ", i); 63 mpfr_dump (x); 64 printf (" y = "); 65 mpfr_dump (y); 66 printf ("Expected flags = "); 67 flags_out (f1); 68 printf ("Obtained flags = "); 69 flags_out (f2); 70 exit (1); 71 } 72 73 if (i > 0) 74 MPFR_ASSERTN (r[i] == r[0]); 75 } 76 77 return r[0]; 78 } 79 80 static void 81 test_cmpabs (void) 82 { 83 mpfr_t xx, yy; 84 85 mpfr_init2 (xx, 2); 86 mpfr_init2 (yy, 2); 87 88 mpfr_clear_erangeflag (); 89 MPFR_SET_NAN (xx); 90 MPFR_SET_NAN (yy); 91 if (cmpabs (xx, yy) != 0) 92 PRINT_ERROR ("mpfr_cmpabs (NAN,NAN) returns non-zero"); 93 if (!mpfr_erangeflag_p ()) 94 PRINT_ERROR ("mpfr_cmpabs (NAN,NAN) doesn't set erange flag"); 95 96 mpfr_set_si (yy, -1, MPFR_RNDN); 97 if (cmpabs (xx, yy) != 0) 98 PRINT_ERROR ("mpfr_cmpabs (NAN,-1) returns non-zero"); 99 if (cmpabs (yy, xx) != 0) 100 PRINT_ERROR ("mpfr_cmpabs (-1,NAN) returns non-zero"); 101 102 mpfr_set_str_binary (xx, "0.10E0"); 103 mpfr_set_str_binary (yy, "-0.10E0"); 104 if (cmpabs (xx, yy) != 0) 105 PRINT_ERROR ("mpfr_cmpabs (xx, yy) returns non-zero for prec=2"); 106 107 mpfr_set_prec (xx, 65); 108 mpfr_set_prec (yy, 65); 109 mpfr_set_str_binary (xx, "-0.10011010101000110101010000000011001001001110001011101011111011101E623"); 110 mpfr_set_str_binary (yy, "0.10011010101000110101010000000011001001001110001011101011111011100E623"); 111 if (cmpabs (xx, yy) <= 0) 112 PRINT_ERROR ("Error (1) in mpfr_cmpabs"); 113 114 mpfr_set_str_binary (xx, "-0.10100010001110110111000010001000010011111101000100011101000011100"); 115 mpfr_set_str_binary (yy, "-0.10100010001110110111000010001000010011111101000100011101000011011"); 116 if (cmpabs (xx, yy) <= 0) 117 PRINT_ERROR ("Error (2) in mpfr_cmpabs"); 118 119 mpfr_set_prec (xx, 160); 120 mpfr_set_prec (yy, 160); 121 mpfr_set_str_binary (xx, "0.1E1"); 122 mpfr_set_str_binary (yy, "-0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000110001110100"); 123 if (cmpabs (xx, yy) <= 0) 124 PRINT_ERROR ("Error (3) in mpfr_cmpabs"); 125 126 mpfr_set_prec(xx, 53); 127 mpfr_set_prec(yy, 200); 128 mpfr_set_ui (xx, 1, (mpfr_rnd_t) 0); 129 mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0); 130 if (cmpabs (xx, yy) != 0) 131 PRINT_ERROR ("Error in mpfr_cmpabs: 1.0 != 1.0"); 132 133 mpfr_set_prec (yy, 31); 134 mpfr_set_str (xx, "-1.0000000002", 10, (mpfr_rnd_t) 0); 135 mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0); 136 if (cmpabs (xx, yy) <= 0) 137 PRINT_ERROR ("Error in mpfr_cmpabs: not 1.0000000002 > 1.0"); 138 mpfr_set_prec(yy, 53); 139 140 mpfr_set_ui(xx, 0, MPFR_RNDN); 141 mpfr_set_str (yy, "-0.1", 10, MPFR_RNDN); 142 if (cmpabs (xx, yy) >= 0) 143 PRINT_ERROR ("Error in mpfr_cmpabs(0.0, 0.1)"); 144 145 mpfr_set_inf (xx, -1); 146 mpfr_set_str (yy, "23489745.0329", 10, MPFR_RNDN); 147 if (cmpabs (xx, yy) <= 0) 148 PRINT_ERROR ("Error in mpfr_cmpabs(-Inf, 23489745.0329)"); 149 150 mpfr_set_inf (xx, 1); 151 mpfr_set_inf (yy, -1); 152 if (cmpabs (xx, yy) != 0) 153 PRINT_ERROR ("Error in mpfr_cmpabs(Inf, -Inf)"); 154 155 mpfr_set_inf (yy, -1); 156 mpfr_set_str (xx, "2346.09234", 10, MPFR_RNDN); 157 if (cmpabs (xx, yy) >= 0) 158 PRINT_ERROR ("Error in mpfr_cmpabs(-Inf, 2346.09234)"); 159 160 mpfr_set_prec (xx, 2); 161 mpfr_set_prec (yy, 128); 162 mpfr_set_str_binary (xx, "0.1E10"); 163 mpfr_set_str_binary (yy, 164 "0.100000000000000000000000000000000000000000000000" 165 "00000000000000000000000000000000000000000000001E10"); 166 if (cmpabs (xx, yy) >= 0) 167 PRINT_ERROR ("Error in mpfr_cmpabs(10.235, 2346.09234)"); 168 mpfr_swap (xx, yy); 169 if (cmpabs (xx, yy) <= 0) 170 PRINT_ERROR ("Error in mpfr_cmpabs(2346.09234, 10.235)"); 171 mpfr_swap (xx, yy); 172 173 mpfr_clear (xx); 174 mpfr_clear (yy); 175 } 176 177 static int 178 cmpabs_ui (mpfr_srcptr x, unsigned long u) 179 { 180 unsigned int i; 181 int r[4]; 182 mpfr_flags_t f1, f2, flags[2] = { 0, MPFR_FLAGS_ALL }; 183 mpfr_exp_t emin, emax; 184 185 emin = mpfr_get_emin (); 186 emax = mpfr_get_emax (); 187 188 for (i = 0; i < 4; i++) 189 { 190 if (i & 2) 191 { 192 mpfr_exp_t e = MPFR_IS_SINGULAR (x) ? emax : MPFR_GET_EXP (x); 193 set_emin (e); 194 set_emax (e); 195 } 196 197 __gmpfr_flags = f1 = flags[i % 2]; 198 r[i] = mpfr_cmpabs_ui (x, u); 199 f2 = __gmpfr_flags; 200 if (MPFR_IS_NAN (x)) 201 f1 |= MPFR_FLAGS_ERANGE; 202 203 if (i & 2) 204 { 205 set_emin (emin); 206 set_emax (emax); 207 } 208 209 if (f1 != f2) 210 { 211 printf ("Flags error in mpfr_cmpabs_ui for i = %u\n x = ", i); 212 mpfr_dump (x); 213 printf (" u = %lu\n", u); 214 printf ("Expected flags = "); 215 flags_out (f1); 216 printf ("Obtained flags = "); 217 flags_out (f2); 218 exit (1); 219 } 220 221 if (i > 0) 222 MPFR_ASSERTN (r[i] == r[0]); 223 } 224 225 return r[0]; 226 } 227 228 static void 229 test_cmpabs_ui (void) 230 { 231 mpfr_t x; 232 233 mpfr_init2 (x, 64); /* should be enough so that ULONG_MAX fits */ 234 /* check NaN */ 235 mpfr_set_nan (x); 236 if (cmpabs_ui (x, 17) != 0) 237 PRINT_ERROR ("mpfr_cmpabs_ui (NaN, 17)"); 238 /* check -Inf */ 239 mpfr_set_inf (x, -1); 240 if (cmpabs_ui (x, 17) <= 0) 241 PRINT_ERROR ("mpfr_cmpabs_ui (-Inf, 17)"); 242 /* check +Inf */ 243 mpfr_set_inf (x, +1); 244 if (cmpabs_ui (x, 17) <= 0) 245 PRINT_ERROR ("mpfr_cmpabs_ui (+Inf, 17)"); 246 /* check -1 */ 247 mpfr_set_si (x, -1, MPFR_RNDN); 248 if (cmpabs_ui (x, 0) <= 0) 249 PRINT_ERROR ("mpfr_cmpabs_ui (-1, 0)"); 250 if (cmpabs_ui (x, 17) >= 0) 251 PRINT_ERROR ("mpfr_cmpabs_ui (-1, 17)"); 252 /* check -0 */ 253 mpfr_set_zero (x, -1); 254 if (cmpabs_ui (x, 0) != 0) 255 PRINT_ERROR ("mpfr_cmpabs_ui (-0, 0)"); 256 if (cmpabs_ui (x, 17) >= 0) 257 PRINT_ERROR ("mpfr_cmpabs_ui (-0, 17)"); 258 /* check +0 */ 259 mpfr_set_zero (x, +1); 260 if (cmpabs_ui (x, 0) != 0) 261 PRINT_ERROR ("mpfr_cmpabs_ui (+0, 0)"); 262 if (cmpabs_ui (x, 17) >= 0) 263 PRINT_ERROR ("mpfr_cmpabs_ui (+0, 17)"); 264 /* check 1 */ 265 mpfr_set_ui (x, 1, MPFR_RNDN); 266 if (cmpabs_ui (x, 0) <= 0) 267 PRINT_ERROR ("mpfr_cmpabs_ui (1, 0)"); 268 if (cmpabs_ui (x, 1) != 0) 269 PRINT_ERROR ("mpfr_cmpabs_ui (1, 1)"); 270 if (cmpabs_ui (x, 17) >= 0) 271 PRINT_ERROR ("mpfr_cmpabs_ui (1, 17)"); 272 /* check ULONG_MAX */ 273 mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN); 274 if (cmpabs_ui (x, 0) <= 0) 275 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, 0)"); 276 if (cmpabs_ui (x, 1) <= 0) 277 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, 1)"); 278 if (cmpabs_ui (x, 17) <= 0) 279 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, 17)"); 280 if (cmpabs_ui (x, ULONG_MAX) != 0) 281 PRINT_ERROR ("mpfr_cmpabs_ui (ULONG_MAX, ULONG_MAX)"); 282 mpfr_clear (x); 283 } 284 285 int 286 main (void) 287 { 288 tests_start_mpfr (); 289 290 test_cmpabs (); 291 test_cmpabs_ui (); 292 293 tests_end_mpfr (); 294 return 0; 295 } 296