1/* Test file for mpfr_get_flt and mpfr_set_flt 2 3Copyright 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. 4Contributed by the AriC and Caramel projects, INRIA. 5 6This file is part of the GNU MPFR Library. 7 8The GNU MPFR Library is free software; you can redistribute it and/or modify 9it under the terms of the GNU Lesser General Public License as published by 10the Free Software Foundation; either version 3 of the License, or (at your 11option) any later version. 12 13The GNU MPFR Library is distributed in the hope that it will be useful, but 14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16License for more details. 17 18You should have received a copy of the GNU Lesser General Public License 19along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23#include <stdlib.h> 24#include <float.h> /* for FLT_MIN */ 25#include "mpfr-test.h" 26 27int 28main (void) 29{ 30 mpfr_t x, y; 31 float f, g, infp; 32 int i; 33 34 infp = (float) DBL_POS_INF; 35 if (infp * 0.5 != infp) 36 { 37 fprintf (stderr, "Error, FLT_MAX + FLT_MAX does not yield INFP\n"); 38 fprintf (stderr, "(this is probably a compiler bug, please report)\n"); 39 exit (1); 40 } 41 42 tests_start_mpfr (); 43 44 mpfr_init2 (x, 24); 45 mpfr_init2 (y, 24); 46 47#if !defined(MPFR_ERRDIVZERO) 48 mpfr_set_nan (x); 49 f = mpfr_get_flt (x, MPFR_RNDN); 50 if (f == f) 51 { 52 printf ("Error for mpfr_get_flt(NaN)\n"); 53 exit (1); 54 } 55 mpfr_set_flt (x, f, MPFR_RNDN); 56 if (mpfr_nan_p (x) == 0) 57 { 58 printf ("Error for mpfr_set_flt(NaN)\n"); 59 exit (1); 60 } 61 62 mpfr_set_inf (x, 1); 63 f = mpfr_get_flt (x, MPFR_RNDN); 64 mpfr_set_flt (x, f, MPFR_RNDN); 65 if (mpfr_inf_p (x) == 0 || mpfr_sgn (x) < 0) 66 { 67 printf ("Error for mpfr_set_flt(mpfr_get_flt(+Inf)):\n"); 68 printf ("f=%f, expected -Inf\n", f); 69 printf ("got "); mpfr_dump (x); 70 exit (1); 71 } 72 73 mpfr_set_inf (x, -1); 74 f = mpfr_get_flt (x, MPFR_RNDN); 75 mpfr_set_flt (x, f, MPFR_RNDN); 76 if (mpfr_inf_p (x) == 0 || mpfr_sgn (x) > 0) 77 { 78 printf ("Error for mpfr_set_flt(mpfr_get_flt(-Inf)):\n"); 79 printf ("f=%f, expected -Inf\n", f); 80 printf ("got "); mpfr_dump (x); 81 exit (1); 82 } 83#endif 84 85 mpfr_set_ui (x, 0, MPFR_RNDN); 86 f = mpfr_get_flt (x, MPFR_RNDN); 87 mpfr_set_flt (x, f, MPFR_RNDN); 88 if (mpfr_zero_p (x) == 0 || MPFR_SIGN (x) < 0) 89 { 90 printf ("Error for mpfr_set_flt(mpfr_get_flt(+0))\n"); 91 exit (1); 92 } 93 94 mpfr_set_ui (x, 0, MPFR_RNDN); 95 mpfr_neg (x, x, MPFR_RNDN); 96 f = mpfr_get_flt (x, MPFR_RNDN); 97 mpfr_set_flt (x, f, MPFR_RNDN); 98 if (mpfr_zero_p (x) == 0 || MPFR_SIGN (x) > 0) 99 { 100 printf ("Error for mpfr_set_flt(mpfr_get_flt(-0))\n"); 101 exit (1); 102 } 103 104 mpfr_set_ui (x, 17, MPFR_RNDN); 105 f = mpfr_get_flt (x, MPFR_RNDN); 106 mpfr_set_flt (x, f, MPFR_RNDN); 107 if (mpfr_cmp_ui (x, 17) != 0) 108 { 109 printf ("Error for mpfr_set_flt(mpfr_get_flt(17))\n"); 110 printf ("expected 17\n"); 111 printf ("got "); 112 mpfr_dump (x); 113 exit (1); 114 } 115 116 mpfr_set_si (x, -42, MPFR_RNDN); 117 f = mpfr_get_flt (x, MPFR_RNDN); 118 mpfr_set_flt (x, f, MPFR_RNDN); 119 if (mpfr_cmp_si (x, -42) != 0) 120 { 121 printf ("Error for mpfr_set_flt(mpfr_get_flt(-42))\n"); 122 printf ("expected -42\n"); 123 printf ("got "); 124 mpfr_dump (x); 125 exit (1); 126 } 127 128 mpfr_set_si_2exp (x, 1, -126, MPFR_RNDN); 129 for (i = -126; i < 128; i++) 130 { 131 f = mpfr_get_flt (x, MPFR_RNDN); 132 mpfr_set_flt (y, f, MPFR_RNDN); 133 if (mpfr_cmp (x, y) != 0) 134 { 135 printf ("Error for mpfr_set_flt(mpfr_get_flt(x))\n"); 136 printf ("expected "); mpfr_dump (x); 137 printf ("got "); mpfr_dump (y); 138 exit (1); 139 } 140 mpfr_mul_2exp (x, x, 1, MPFR_RNDN); 141 } 142 143 mpfr_set_prec (x, 53); 144 mpfr_set_si_2exp (x, 1, -126, MPFR_RNDN); 145 for (i = -126; i < 128; i++) 146 { 147 mpfr_nextbelow (x); 148 f = mpfr_get_flt (x, MPFR_RNDN); 149 mpfr_nextabove (x); 150 mpfr_set_flt (y, f, MPFR_RNDN); 151 if (mpfr_cmp (x, y) != 0) 152 { 153 printf ("Error for mpfr_set_flt(mpfr_get_flt(x))\n"); 154 printf ("expected "); mpfr_dump (x); 155 printf ("got "); mpfr_dump (y); 156 exit (1); 157 } 158 mpfr_mul_2exp (x, x, 1, MPFR_RNDN); 159 } 160 161 mpfr_set_prec (x, 53); 162 mpfr_set_si_2exp (x, 1, -126, MPFR_RNDN); 163 for (i = -126; i < 128; i++) 164 { 165 mpfr_nextabove (x); 166 f = mpfr_get_flt (x, MPFR_RNDN); 167 mpfr_nextbelow (x); 168 mpfr_set_flt (y, f, MPFR_RNDN); 169 if (mpfr_cmp (x, y) != 0) 170 { 171 printf ("Error for mpfr_set_flt(mpfr_get_flt(x))\n"); 172 printf ("expected "); mpfr_dump (x); 173 printf ("got "); mpfr_dump (y); 174 exit (1); 175 } 176 mpfr_mul_2exp (x, x, 1, MPFR_RNDN); 177 } 178 179 mpfr_set_si_2exp (x, 1, -150, MPFR_RNDN); 180 g = 0.0; 181 f = mpfr_get_flt (x, MPFR_RNDN); 182 if (f != g) 183 { 184 printf ("Error for mpfr_get_flt(2^(-150),RNDN)\n"); 185 printf ("expected %.8e, got %.8e\n", g, f); 186 exit (1); 187 } 188 f = mpfr_get_flt (x, MPFR_RNDZ); 189 if (f != g) 190 { 191 printf ("Error for mpfr_get_flt(2^(-150),RNDZ)\n"); 192 printf ("expected %.8e, got %.8e\n", g, f); 193 exit (1); 194 } 195 f = mpfr_get_flt (x, MPFR_RNDD); 196 if (f != g) 197 { 198 printf ("Error for mpfr_get_flt(2^(-150),RNDD)\n"); 199 printf ("expected %.8e, got %.8e\n", g, f); 200 exit (1); 201 } 202 g = FLT_MIN * FLT_EPSILON; 203 f = mpfr_get_flt (x, MPFR_RNDU); 204 if (f != g) 205 { 206 printf ("Error for mpfr_get_flt(2^(-150),RNDU)\n"); 207 printf ("expected %.8e, got %.8e\n", g, f); 208 exit (1); 209 } 210 f = mpfr_get_flt (x, MPFR_RNDA); 211 if (f != g) 212 { 213 printf ("Error for mpfr_get_flt(2^(-150),RNDA)\n"); 214 printf ("expected %.8e, got %.8e\n", g, f); 215 exit (1); 216 } 217 218 mpfr_set_si_2exp (x, 1, -151, MPFR_RNDN); 219 g = 0.0; 220 f = mpfr_get_flt (x, MPFR_RNDN); 221 if (f != g) 222 { 223 printf ("Error for mpfr_get_flt(2^(-151),RNDN)\n"); 224 printf ("expected %.8e, got %.8e\n", g, f); 225 exit (1); 226 } 227 f = mpfr_get_flt (x, MPFR_RNDZ); 228 if (f != g) 229 { 230 printf ("Error for mpfr_get_flt(2^(-151),RNDZ)\n"); 231 printf ("expected %.8e, got %.8e\n", g, f); 232 exit (1); 233 } 234 f = mpfr_get_flt (x, MPFR_RNDD); 235 if (f != g) 236 { 237 printf ("Error for mpfr_get_flt(2^(-151),RNDD)\n"); 238 printf ("expected %.8e, got %.8e\n", g, f); 239 exit (1); 240 } 241 g = FLT_MIN * FLT_EPSILON; 242 f = mpfr_get_flt (x, MPFR_RNDU); 243 if (f != g) 244 { 245 printf ("Error for mpfr_get_flt(2^(-151),RNDU)\n"); 246 printf ("expected %.8e, got %.8e\n", g, f); 247 exit (1); 248 } 249 f = mpfr_get_flt (x, MPFR_RNDA); 250 if (f != g) 251 { 252 printf ("Error for mpfr_get_flt(2^(-151),RNDA)\n"); 253 printf ("expected %.8e, got %.8e\n", g, f); 254 exit (1); 255 } 256 257 mpfr_set_si_2exp (x, 1, -149, MPFR_RNDN); 258 g = FLT_MIN * FLT_EPSILON; 259 f = mpfr_get_flt (x, MPFR_RNDN); 260 if (f != g) 261 { 262 printf ("Error for mpfr_get_flt(2^(-149),RNDN)\n"); 263 printf ("expected %.8e, got %.8e\n", g, f); 264 exit (1); 265 } 266 f = mpfr_get_flt (x, MPFR_RNDZ); 267 if (f != g) 268 { 269 printf ("Error for mpfr_get_flt(2^(-149),RNDZ)\n"); 270 printf ("expected %.8e, got %.8e\n", g, f); 271 exit (1); 272 } 273 f = mpfr_get_flt (x, MPFR_RNDD); 274 if (f != g) 275 { 276 printf ("Error for mpfr_get_flt(2^(-149),RNDD)\n"); 277 printf ("expected %.8e, got %.8e\n", g, f); 278 exit (1); 279 } 280 f = mpfr_get_flt (x, MPFR_RNDU); 281 if (f != g) 282 { 283 printf ("Error for mpfr_get_flt(2^(-149),RNDU)\n"); 284 printf ("expected %.8e, got %.8e\n", g, f); 285 exit (1); 286 } 287 f = mpfr_get_flt (x, MPFR_RNDA); 288 if (f != g) 289 { 290 printf ("Error for mpfr_get_flt(2^(-149),RNDA)\n"); 291 printf ("expected %.8e, got %.8e\n", g, f); 292 exit (1); 293 } 294 295 mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN); 296 g = FLT_MAX; 297 f = mpfr_get_flt (x, MPFR_RNDZ); 298 if (f != g) 299 { 300 printf ("Error for mpfr_get_flt(2^128,RNDZ)\n"); 301 printf ("expected %.8e, got %.8e\n", g, f); 302 exit (1); 303 } 304 f = mpfr_get_flt (x, MPFR_RNDD); 305 if (f != g) 306 { 307 printf ("Error for mpfr_get_flt(2^128,RNDD)\n"); 308 printf ("expected %.8e, got %.8e\n", g, f); 309 exit (1); 310 } 311#if !defined(MPFR_ERRDIVZERO) 312 f = mpfr_get_flt (x, MPFR_RNDN); /* 2^128 rounds to itself with extended 313 exponent range, we should get +Inf */ 314 g = infp; 315 if (f != g) 316 { 317 printf ("Error for mpfr_get_flt(2^128,RNDN)\n"); 318 printf ("expected %.8e, got %.8e\n", g, f); 319 exit (1); 320 } 321 f = mpfr_get_flt (x, MPFR_RNDU); 322 if (f != g) 323 { 324 printf ("Error for mpfr_get_flt(2^128,RNDU)\n"); 325 printf ("expected %.8e, got %.8e\n", g, f); 326 exit (1); 327 } 328 f = mpfr_get_flt (x, MPFR_RNDA); 329 if (f != g) 330 { 331 printf ("Error for mpfr_get_flt(2^128,RNDA)\n"); 332 printf ("expected %.8e, got %.8e\n", g, f); 333 exit (1); 334 } 335#endif 336 337 /* corner case: take x with 25 bits just below 2^128 */ 338 mpfr_set_prec (x, 25); 339 mpfr_set_si_2exp (x, 1, 128, MPFR_RNDN); 340 mpfr_nextbelow (x); 341 g = FLT_MAX; 342 f = mpfr_get_flt (x, MPFR_RNDZ); 343 if (f != g) 344 { 345 printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDZ)\n"); 346 printf ("expected %.8e, got %.8e\n", g, f); 347 exit (1); 348 } 349 f = mpfr_get_flt (x, MPFR_RNDD); 350 if (f != g) 351 { 352 printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDD)\n"); 353 printf ("expected %.8e, got %.8e\n", g, f); 354 exit (1); 355 } 356 f = mpfr_get_flt (x, MPFR_RNDN); /* first round to 2^128 (even rule), 357 thus we should get +Inf */ 358 g = infp; 359 if (f != g) 360 { 361 printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDN)\n"); 362 printf ("expected %.8e, got %.8e\n", g, f); 363 exit (1); 364 } 365 f = mpfr_get_flt (x, MPFR_RNDU); 366 if (f != g) 367 { 368 printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDU)\n"); 369 printf ("expected %.8e, got %.8e\n", g, f); 370 exit (1); 371 } 372 f = mpfr_get_flt (x, MPFR_RNDA); 373 if (f != g) 374 { 375 printf ("Error for mpfr_get_flt(2^128*(1-2^(-25)),RNDA)\n"); 376 printf ("expected %.8e, got %.8e\n", g, f); 377 exit (1); 378 } 379 380 mpfr_clear (x); 381 mpfr_clear (y); 382 383 tests_end_mpfr (); 384 return 0; 385} 386