1 /* Test file for mpfr_cmp_ui and mpfr_cmp_si. 2 3 Copyright 1999, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 4 Contributed by the AriC and Caramel 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 http://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 #ifdef TCMP_UI_CHECK_NAN 24 25 mpfr_clear_erangeflag (); 26 c = mpfr_cmp_si (x, TCMP_UI_CHECK_NAN); 27 if (c != 0 || !mpfr_erangeflag_p ()) 28 { 29 printf ("NaN error on %d (1)\n", TCMP_UI_CHECK_NAN); 30 exit (1); 31 } 32 mpfr_clear_erangeflag (); 33 c = (mpfr_cmp_si) (x, TCMP_UI_CHECK_NAN); 34 if (c != 0 || !mpfr_erangeflag_p ()) 35 { 36 printf ("NaN error on %d (2)\n", TCMP_UI_CHECK_NAN); 37 exit (1); 38 } 39 if (TCMP_UI_CHECK_NAN >= 0) 40 { 41 mpfr_clear_erangeflag (); 42 c = mpfr_cmp_ui (x, TCMP_UI_CHECK_NAN); 43 if (c != 0 || !mpfr_erangeflag_p ()) 44 { 45 printf ("NaN error on %d (3)\n", TCMP_UI_CHECK_NAN); 46 exit (1); 47 } 48 mpfr_clear_erangeflag (); 49 c = (mpfr_cmp_ui) (x, TCMP_UI_CHECK_NAN); 50 if (c != 0 || !mpfr_erangeflag_p ()) 51 { 52 printf ("NaN error on %d (4)\n", TCMP_UI_CHECK_NAN); 53 exit (1); 54 } 55 } 56 57 #else 58 59 #include <stdio.h> 60 #include <stdlib.h> 61 62 #include "mpfr-test.h" 63 64 static void 65 check_nan (void) 66 { 67 mpfr_t x; 68 int c, i; 69 70 mpfr_init (x); 71 mpfr_set_nan (x); 72 /* We need constants to completely test the macros. */ 73 #undef TCMP_UI_CHECK_NAN 74 #define TCMP_UI_CHECK_NAN -17 75 #include "tcmp_ui.c" 76 #undef TCMP_UI_CHECK_NAN 77 #define TCMP_UI_CHECK_NAN 0 78 #include "tcmp_ui.c" 79 #undef TCMP_UI_CHECK_NAN 80 #define TCMP_UI_CHECK_NAN 17 81 #include "tcmp_ui.c" 82 for (i = -17; i <= 17; i += 17) 83 { 84 #undef TCMP_UI_CHECK_NAN 85 #define TCMP_UI_CHECK_NAN i 86 #include "tcmp_ui.c" 87 } 88 mpfr_clear (x); 89 } 90 91 /* Since mpfr_cmp_ui and mpfr_cmp_si are also implemented by a macro 92 with __builtin_constant_p for GCC, check that side effects are 93 handled correctly. */ 94 static void 95 check_macros (void) 96 { 97 mpfr_t x; 98 int c; 99 100 mpfr_init2 (x, 32); 101 102 c = 0; 103 mpfr_set_ui (x, 17, MPFR_RNDN); 104 if (mpfr_cmp_ui (x, 17) != 0) 105 { 106 printf ("Error 1 on mpfr_cmp_ui(x,17) in check_macros\n"); 107 exit (1); 108 } 109 if (mpfr_cmp_ui (x, (c++, 17)) != 0) 110 { 111 printf ("Error 2 on mpfr_cmp_ui(x,17) in check_macros\n"); 112 exit (1); 113 } 114 if (c != 1) 115 { 116 printf ("Error 3 on mpfr_cmp_ui(x,17) in check_macros\n" 117 "(c = %d instead of 1)\n", c); 118 exit (1); 119 } 120 if (mpfr_cmp_si (x, 17) != 0) 121 { 122 printf ("Error 1 on mpfr_cmp_si(x,17) in check_macros\n"); 123 exit (1); 124 } 125 if (mpfr_cmp_si (x, (c++, 17)) != 0) 126 { 127 printf ("Error 2 on mpfr_cmp_si(x,17) in check_macros\n"); 128 exit (1); 129 } 130 if (c != 2) 131 { 132 printf ("Error 3 on mpfr_cmp_si(x,17) in check_macros\n" 133 "(c = %d instead of 2)\n", c); 134 exit (1); 135 } 136 137 c = 0; 138 mpfr_set_ui (x, 0, MPFR_RNDN); 139 if (mpfr_cmp_ui (x, 0) != 0) 140 { 141 printf ("Error 1 on mpfr_cmp_ui(x,0) in check_macros\n"); 142 exit (1); 143 } 144 if (mpfr_cmp_ui (x, (c++, 0)) != 0) 145 { 146 printf ("Error 2 on mpfr_cmp_ui(x,0) in check_macros\n"); 147 exit (1); 148 } 149 if (c != 1) 150 { 151 printf ("Error 3 on mpfr_cmp_ui(x,0) in check_macros\n" 152 "(c = %d instead of 1)\n", c); 153 exit (1); 154 } 155 if (mpfr_cmp_si (x, 0) != 0) 156 { 157 printf ("Error 1 on mpfr_cmp_si(x,0) in check_macros\n"); 158 exit (1); 159 } 160 if (mpfr_cmp_si (x, (c++, 0)) != 0) 161 { 162 printf ("Error 2 on mpfr_cmp_si(x,0) in check_macros\n"); 163 exit (1); 164 } 165 if (c != 2) 166 { 167 printf ("Error 3 on mpfr_cmp_si(x,0) in check_macros\n" 168 "(c = %d instead of 2)\n", c); 169 exit (1); 170 } 171 172 mpfr_clear (x); 173 } 174 175 /* Bug in r7114 */ 176 static void 177 test_macros (void) 178 { 179 mpfr_t x[3]; 180 mpfr_ptr p; 181 182 mpfr_inits (x[0], x[1], x[2], (mpfr_ptr) 0); 183 mpfr_set_ui (x[0], 0, MPFR_RNDN); 184 p = x[0]; 185 if (mpfr_cmp_ui (p++, 0) != 0) 186 { 187 printf ("Error in mpfr_cmp_ui macro: result should be 0.\n"); 188 exit (1); 189 } 190 if (p != x[1]) 191 { 192 printf ("Error in mpfr_cmp_ui macro: p - x[0] = %d (expecting 1)\n", 193 (int) (p - x[0])); 194 exit (1); 195 } 196 p = x[0]; 197 if (mpfr_cmp_si (p++, 0) != 0) 198 { 199 printf ("Error in mpfr_cmp_si macro: result should be 0.\n"); 200 exit (1); 201 } 202 if (p != x[1]) 203 { 204 printf ("Error in mpfr_cmp_si macro: p - x[0] = %d (expecting 1)\n", 205 (int) (p - x[0])); 206 exit (1); 207 } 208 mpfr_clears (x[0], x[1], x[2], (mpfr_ptr) 0); 209 } 210 211 int 212 main (void) 213 { 214 mpfr_t x; 215 unsigned long i; 216 long s; 217 218 tests_start_mpfr (); 219 220 mpfr_init(x); 221 222 /* tests for cmp_ui */ 223 mpfr_set_ui (x, 3, MPFR_RNDZ); 224 if ((mpfr_cmp_ui) (x, i = 3) != 0) 225 { 226 printf ("Error in mpfr_cmp_ui(3.0, 3)\n"); 227 exit (1); 228 } 229 if (mpfr_cmp_ui (x, i = 2) <= 0) 230 { 231 printf ("Error in mpfr_cmp_ui(3.0,2)\n"); 232 exit (1); 233 } 234 if (mpfr_cmp_ui (x, i = 4) >= 0) 235 { 236 printf ("Error in mpfr_cmp_ui(3.0,4)\n"); 237 exit (1); 238 } 239 mpfr_set_ui (x, 0, MPFR_RNDZ); 240 mpfr_neg (x, x, MPFR_RNDZ); 241 if (mpfr_cmp_ui (x, i = 0)) 242 { 243 printf ("Error in mpfr_cmp_ui(0.0,0)\n"); 244 exit (1); 245 } 246 mpfr_set_ui (x, 1, MPFR_RNDZ); 247 if (mpfr_cmp_ui (x, i = 0) == 0) 248 { 249 printf ("Error in mpfr_cmp_ui(1.0,0)\n"); 250 exit (1); 251 } 252 253 mpfr_set_inf (x, 1); 254 if (mpfr_cmp_ui (x, 1) <= 0) 255 { 256 printf ("Error in mpfr_cmp_ui (Inf, 0)\n"); 257 exit (1); 258 } 259 mpfr_set_inf (x, -1); 260 if (mpfr_cmp_ui (x, 1) >= 0) 261 { 262 printf ("Error in mpfr_cmp_ui (-Inf, 0)\n"); 263 exit (1); 264 } 265 266 mpfr_set_si (x, -1, MPFR_RNDN); 267 MPFR_ASSERTN(mpfr_cmp_ui (x, 1) < 0); 268 MPFR_ASSERTN(mpfr_cmp_ui (x, 0) < 0); 269 270 mpfr_set_ui (x, 1, MPFR_RNDN); 271 MPFR_ASSERTN(mpfr_cmp_ui (x, 0) > 0); 272 273 /* tests for cmp_si */ 274 (mpfr_set_si) (x, -3, MPFR_RNDZ); 275 if ((mpfr_cmp_si) (x, s = -3) != 0) 276 { 277 printf ("Error in mpfr_cmp_si(-3.0,-3)\n"); 278 exit (1); 279 } 280 if (mpfr_cmp_si (x, s = -4) <= 0) 281 { 282 printf ("Error in mpfr_cmp_si(-3.0,-4)\n"); 283 exit (1); 284 } 285 if (mpfr_cmp_si (x, s = 1) >= 0) 286 { 287 printf ("Error in mpfr_cmp_si(-3.0,1)\n"); 288 exit (1); 289 } 290 291 mpfr_set_inf (x, 1); 292 if (mpfr_cmp_si (x, -1) <= 0) 293 { 294 printf ("Error in mpfr_cmp_si (Inf, 0)\n"); 295 exit (1); 296 } 297 mpfr_set_inf (x, -1); 298 if (mpfr_cmp_si (x, -1) >= 0) 299 { 300 printf ("Error in mpfr_cmp_si (-Inf, 0)\n"); 301 exit (1); 302 } 303 304 /* case b=0 */ 305 mpfr_set_ui (x, 0, MPFR_RNDZ); 306 MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0); 307 MPFR_ASSERTN(mpfr_cmp_si (x, 1) < 0); 308 MPFR_ASSERTN(mpfr_cmp_si (x, -1) > 0); 309 310 /* case i=0 */ 311 mpfr_set_ui (x, 1, MPFR_RNDZ); 312 MPFR_ASSERTN(mpfr_cmp_si (x, 0) > 0); 313 mpfr_set_ui (x, 0, MPFR_RNDZ); 314 MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0); 315 mpfr_neg (x, x, MPFR_RNDZ); 316 MPFR_ASSERTN(mpfr_cmp_si (x, 0) == 0); 317 mpfr_set_si (x, -1, MPFR_RNDZ); 318 MPFR_ASSERTN(mpfr_cmp_si (x, 0) < 0); 319 320 /* case large x */ 321 mpfr_set_str_binary (x, "1E100"); 322 MPFR_ASSERTN(mpfr_cmp_si (x, 0) > 0); 323 MPFR_ASSERTN(mpfr_cmp_si (x, 1) > 0); 324 MPFR_ASSERTN(mpfr_cmp_si (x, -1) > 0); 325 mpfr_set_str_binary (x, "-1E100"); 326 MPFR_ASSERTN(mpfr_cmp_si (x, 0) < 0); 327 MPFR_ASSERTN(mpfr_cmp_si (x, 1) < 0); 328 MPFR_ASSERTN(mpfr_cmp_si (x, -1) < 0); 329 330 /* corner case */ 331 mpfr_set_ui (x, 1, MPFR_RNDZ); 332 mpfr_mul_2exp (x, x, GMP_NUMB_BITS - 1, MPFR_RNDZ); 333 /* now EXP(x)=GMP_NUMB_BITS */ 334 MPFR_ASSERTN(mpfr_cmp_si (x, 1) > 0); 335 336 mpfr_clear (x); 337 338 check_nan (); 339 check_macros (); 340 test_macros (); 341 342 tests_end_mpfr (); 343 return 0; 344 } 345 346 #endif 347