1 /* Test file for mpfr_sub1sp. 2 3 Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4 Contributed by the Arenaire and Cacao 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 #include <stdio.h> 24 #include <stdlib.h> 25 26 #include "mpfr-test.h" 27 28 static void check_special (void); 29 static void check_random (mpfr_prec_t p); 30 31 int 32 main (void) 33 { 34 mpfr_prec_t p; 35 36 tests_start_mpfr (); 37 38 check_special (); 39 for (p = 2 ; p < 200 ; p++) 40 check_random (p); 41 42 tests_end_mpfr (); 43 return 0; 44 } 45 46 #define STD_ERROR \ 47 {\ 48 printf("ERROR: for %s and p=%lu and i=%d:\nY=",\ 49 mpfr_print_rnd_mode ((mpfr_rnd_t) r), p, i);\ 50 mpfr_print_binary(y);\ 51 printf("\nZ="); mpfr_print_binary(z);\ 52 printf("\nReal: "); mpfr_print_binary(x2);\ 53 printf("\nGot : "); mpfr_print_binary(x);\ 54 putchar('\n');\ 55 exit(1);\ 56 } 57 58 #define STD_ERROR2 \ 59 {\ 60 printf("ERROR: for %s and p=%lu and i=%d:\nY=",\ 61 mpfr_print_rnd_mode ((mpfr_rnd_t) r), p, i);\ 62 mpfr_print_binary(y);\ 63 printf("\nZ="); mpfr_print_binary(z);\ 64 printf("\nR="); mpfr_print_binary(x);\ 65 printf("\nWrong inexact flag. Real: %d. Got: %d\n", \ 66 inexact1, inexact2); \ 67 exit(1);\ 68 } 69 70 static void 71 check_random (mpfr_prec_t p) 72 { 73 mpfr_t x,y,z,x2; 74 int r; 75 int i, inexact1, inexact2; 76 77 mpfr_inits2 (p, x, y, z, x2, (mpfr_ptr) 0); 78 79 for (i = 0 ; i < 500 ; i++) 80 { 81 mpfr_urandomb (y, RANDS); 82 mpfr_urandomb (z, RANDS); 83 if (MPFR_IS_PURE_FP(y) && MPFR_IS_PURE_FP(z)) 84 for(r = 0 ; r < MPFR_RND_MAX ; r++) 85 { 86 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 87 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 88 if (mpfr_cmp(x, x2)) 89 STD_ERROR; 90 if (inexact1 != inexact2) 91 STD_ERROR2; 92 } 93 } 94 95 mpfr_clears (x, y, z, x2, (mpfr_ptr) 0); 96 } 97 98 static void 99 check_special (void) 100 { 101 mpfr_t x,y,z,x2; 102 int r; 103 mpfr_prec_t p; 104 int i = -1, inexact1, inexact2; 105 mpfr_exp_t es; 106 107 mpfr_inits (x, y, z, x2, (mpfr_ptr) 0); 108 109 for (r = 0 ; r < MPFR_RND_MAX ; r++) 110 { 111 p = 53; 112 mpfr_set_prec(x, 53); 113 mpfr_set_prec(x2, 53); 114 mpfr_set_prec(y, 53); 115 mpfr_set_prec(z, 53); 116 117 mpfr_set_str_binary (y, 118 "0.10110111101101110010010010011011000001101101011011001E31"); 119 120 mpfr_sub1sp (x, y, y, (mpfr_rnd_t) r); 121 if (mpfr_cmp_ui(x, 0)) 122 { 123 printf("Error for x-x with p=%lu. Expected 0. Got:", p); 124 mpfr_print_binary(x); 125 exit(1); 126 } 127 128 mpfr_set(z, y, (mpfr_rnd_t) r); 129 mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 130 if (mpfr_cmp_ui(x, 0)) 131 { 132 printf("Error for x-y with y=x and p=%lu. Expected 0. Got:", p); 133 mpfr_print_binary(x); 134 exit(1); 135 } 136 /* diff = 0 */ 137 mpfr_set_str_binary (y, 138 "0.10110111101101110010010010011011001001101101011011001E31"); 139 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 140 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 141 if (mpfr_cmp(x, x2)) 142 STD_ERROR; 143 if (inexact1 != inexact2) 144 STD_ERROR2; 145 146 /* Diff = 1 */ 147 mpfr_set_str_binary (y, 148 "0.10110111101101110010010010011011000001101101011011001E30"); 149 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 150 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 151 if (mpfr_cmp(x, x2)) 152 STD_ERROR; 153 if (inexact1 != inexact2) 154 STD_ERROR2; 155 156 /* Diff = 2 */ 157 mpfr_set_str_binary (y, 158 "0.10110111101101110010010010011011000101101101011011001E32"); 159 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 160 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 161 if (mpfr_cmp(x, x2)) 162 STD_ERROR; 163 if (inexact1 != inexact2) 164 STD_ERROR2; 165 166 /* Diff = 32 */ 167 mpfr_set_str_binary (y, 168 "0.10110111101101110010010010011011000001101101011011001E63"); 169 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 170 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 171 if (mpfr_cmp(x, x2)) 172 STD_ERROR; 173 if (inexact1 != inexact2) 174 STD_ERROR2; 175 176 /* Diff = 52 */ 177 mpfr_set_str_binary (y, 178 "0.10110111101101110010010010011011010001101101011011001E83"); 179 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 180 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 181 if (mpfr_cmp(x, x2)) 182 STD_ERROR; 183 if (inexact1 != inexact2) 184 STD_ERROR2; 185 186 /* Diff = 53 */ 187 mpfr_set_str_binary (y, 188 "0.10110111101101110010010010011111000001101101011011001E31"); 189 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 190 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 191 if (mpfr_cmp(x, x2)) 192 STD_ERROR; 193 if (inexact1 != inexact2) 194 STD_ERROR2; 195 196 /* Diff > 200 */ 197 mpfr_set_str_binary (y, 198 "0.10110111101101110010010010011011000001101101011011001E331"); 199 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 200 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 201 if (mpfr_cmp(x, x2)) 202 STD_ERROR; 203 if (inexact1 != inexact2) 204 STD_ERROR2; 205 206 mpfr_set_str_binary (y, 207 "0.10000000000000000000000000000000000000000000000000000E31"); 208 mpfr_set_str_binary (z, 209 "0.11111111111111111111111111111111111111111111111111111E30"); 210 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 211 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 212 if (mpfr_cmp(x, x2)) 213 STD_ERROR; 214 if (inexact1 != inexact2) 215 STD_ERROR2; 216 217 mpfr_set_str_binary (y, 218 "0.10000000000000000000000000000000000000000000000000000E31"); 219 mpfr_set_str_binary (z, 220 "0.11111111111111111111111111111111111111111111111111111E29"); 221 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 222 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 223 if (mpfr_cmp(x, x2)) 224 STD_ERROR; 225 if (inexact1 != inexact2) 226 STD_ERROR2; 227 228 mpfr_set_str_binary (y, 229 "0.10000000000000000000000000000000000000000000000000000E52"); 230 mpfr_set_str_binary (z, 231 "0.10000000000010000000000000000000000000000000000000000E00"); 232 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 233 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 234 if (mpfr_cmp(x, x2)) 235 STD_ERROR; 236 if (inexact1 != inexact2) 237 STD_ERROR2; 238 239 mpfr_set_str_binary (y, 240 "0.11100000000000000000000000000000000000000000000000000E53"); 241 mpfr_set_str_binary (z, 242 "0.10000000000000000000000000000000000000000000000000000E00"); 243 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 244 inexact2 = mpfr_sub1sp(z, y, z, (mpfr_rnd_t) r); 245 mpfr_set(x, z, (mpfr_rnd_t) r); 246 if (mpfr_cmp(x, x2)) 247 STD_ERROR; 248 if (inexact1 != inexact2) 249 STD_ERROR2; 250 251 mpfr_set_str_binary (y, 252 "0.10000000000000000000000000000000000000000000000000000E53"); 253 mpfr_set_str_binary (z, 254 "0.10100000000000000000000000000000000000000000000000000E00"); 255 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 256 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 257 if (mpfr_cmp(x, x2)) 258 STD_ERROR; 259 if (inexact1 != inexact2) 260 STD_ERROR2; 261 262 mpfr_set_str_binary (y, 263 "0.10000000000000000000000000000000000000000000000000000E54"); 264 mpfr_set_str_binary (z, 265 "0.10100000000000000000000000000000000000000000000000000E00"); 266 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 267 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 268 if (mpfr_cmp(x, x2)) 269 STD_ERROR; 270 if (inexact1 != inexact2) 271 STD_ERROR2; 272 273 p = 63; 274 mpfr_set_prec(x, p); 275 mpfr_set_prec(x2, p); 276 mpfr_set_prec(y, p); 277 mpfr_set_prec(z, p); 278 mpfr_set_str_binary (y, 279 "0.100000000000000000000000000000000000000000000000000000000000000E62"); 280 mpfr_set_str_binary (z, 281 "0.110000000000000000000000000000000000000000000000000000000000000E00"); 282 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 283 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 284 if (mpfr_cmp(x, x2)) 285 STD_ERROR; 286 if (inexact1 != inexact2) 287 STD_ERROR2; 288 289 p = 64; 290 mpfr_set_prec(x, 64); 291 mpfr_set_prec(x2, 64); 292 mpfr_set_prec(y, 64); 293 mpfr_set_prec(z, 64); 294 295 mpfr_set_str_binary (y, 296 "0.1100000000000000000000000000000000000000000000000000000000000000E31"); 297 mpfr_set_str_binary (z, 298 "0.1111111111111111111111111110000000000000000000000000011111111111E29"); 299 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 300 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 301 if (mpfr_cmp(x, x2)) 302 STD_ERROR; 303 if (inexact1 != inexact2) 304 STD_ERROR2; 305 306 mpfr_set_str_binary (y, 307 "0.1000000000000000000000000000000000000000000000000000000000000000E63"); 308 mpfr_set_str_binary (z, 309 "0.1011000000000000000000000000000000000000000000000000000000000000E00"); 310 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 311 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 312 if (mpfr_cmp(x, x2)) 313 STD_ERROR; 314 if (inexact1 != inexact2) 315 STD_ERROR2; 316 317 mpfr_set_str_binary (y, 318 "0.1000000000000000000000000000000000000000000000000000000000000000E63"); 319 mpfr_set_str_binary (z, 320 "0.1110000000000000000000000000000000000000000000000000000000000000E00"); 321 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 322 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 323 if (mpfr_cmp(x, x2)) 324 STD_ERROR; 325 if (inexact1 != inexact2) 326 STD_ERROR2; 327 328 mpfr_set_str_binary (y, 329 "0.10000000000000000000000000000000000000000000000000000000000000E63"); 330 mpfr_set_str_binary (z, 331 "0.10000000000000000000000000000000000000000000000000000000000000E00"); 332 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 333 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 334 if (mpfr_cmp(x, x2)) 335 STD_ERROR; 336 if (inexact1 != inexact2) 337 STD_ERROR2; 338 339 mpfr_set_str_binary (y, 340 "0.1000000000000000000000000000000000000000000000000000000000000000E64"); 341 mpfr_set_str_binary (z, 342 "0.1010000000000000000000000000000000000000000000000000000000000000E00"); 343 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 344 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 345 if (mpfr_cmp(x, x2)) 346 STD_ERROR; 347 if (inexact1 != inexact2) 348 STD_ERROR2; 349 350 MPFR_SET_NAN(x); 351 MPFR_SET_NAN(x2); 352 mpfr_set_str_binary (y, 353 "0.1000000000000000000000000000000000000000000000000000000000000000" 354 "E-1073741823"); 355 mpfr_set_str_binary (z, 356 "0.1100000000000000000000000000000000000000000000000000000000000000" 357 "E-1073741823"); 358 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 359 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 360 if (mpfr_cmp(x, x2)) 361 STD_ERROR; 362 if (inexact1 != inexact2) 363 STD_ERROR2; 364 365 p = 9; 366 mpfr_set_prec(x, p); 367 mpfr_set_prec(x2, p); 368 mpfr_set_prec(y, p); 369 mpfr_set_prec(z, p); 370 371 mpfr_set_str_binary (y, "0.100000000E1"); 372 mpfr_set_str_binary (z, "0.100000000E-8"); 373 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 374 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 375 if (mpfr_cmp(x, x2)) 376 STD_ERROR; 377 if (inexact1 != inexact2) 378 STD_ERROR2; 379 380 p = 34; 381 mpfr_set_prec(x, p); 382 mpfr_set_prec(x2, p); 383 mpfr_set_prec(y, p); 384 mpfr_set_prec(z, p); 385 386 mpfr_set_str_binary (y, "-0.1011110000111100010111011100110100E-18"); 387 mpfr_set_str_binary (z, "0.1000101010110011010101011110000000E-14"); 388 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 389 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 390 if (mpfr_cmp(x, x2)) 391 STD_ERROR; 392 if (inexact1 != inexact2) 393 STD_ERROR2; 394 395 p = 124; 396 mpfr_set_prec(x, p); 397 mpfr_set_prec(x2, p); 398 mpfr_set_prec(y, p); 399 mpfr_set_prec(z, p); 400 401 mpfr_set_str_binary (y, 402 "0.1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E1"); 403 mpfr_set_str_binary (z, 404 "0.1011111000100111000011001000011101010101101100101010101001000001110100001101110110001110111010000011101001100010111110001100E-31"); 405 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 406 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 407 if (mpfr_cmp(x, x2)) 408 STD_ERROR; 409 if (inexact1 != inexact2) 410 STD_ERROR2; 411 412 p = 288; 413 mpfr_set_prec(x, p); 414 mpfr_set_prec(x2, p); 415 mpfr_set_prec(y, p); 416 mpfr_set_prec(z, p); 417 418 mpfr_set_str_binary (y, 419 "0.111000110011000001000111101010111011110011101001101111111110000011100101000001001010110010101010011001010100000001110011110001010101101010001011101110100100001011110100110000101101100011010001001011011010101010000010001101001000110010010111111011110001111101001000101101001100101100101000E80"); 420 mpfr_set_str_binary (z, 421 "-0.100001111111101001011010001100110010100111001110000110011101001011010100001000000100111011010110110010000000000010101101011000010000110001110010100001100101011100100100001011000100011110000001010101000100011101001000010111100000111000111011001000100100011000100000010010111000000100100111E-258"); 422 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 423 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 424 if (mpfr_cmp(x, x2)) 425 STD_ERROR; 426 if (inexact1 != inexact2) 427 STD_ERROR2; 428 429 p = 85; 430 mpfr_set_prec(x, p); 431 mpfr_set_prec(x2, p); 432 mpfr_set_prec(y, p); 433 mpfr_set_prec(z, p); 434 435 mpfr_set_str_binary (y, 436 "0.1111101110100110110110100010101011101001100010100011110110110010010011101100101111100E-4"); 437 mpfr_set_str_binary (z, 438 "0.1111101110100110110110100010101001001000011000111000011101100101110100001110101010110E-4"); 439 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 440 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 441 if (mpfr_cmp(x, x2)) 442 STD_ERROR; 443 if (inexact1 != inexact2) 444 STD_ERROR2; 445 446 p = 64; 447 mpfr_set_prec(x, p); mpfr_set_prec(x2, p); 448 mpfr_set_prec(y, p); mpfr_set_prec(z, p); 449 450 mpfr_set_str_binary (y, 451 "0.11000000000000000000000000000000" 452 "00000000000000000000000000000000E1"); 453 mpfr_set_str_binary (z, 454 "0.10000000000000000000000000000000" 455 "00000000000000000000000000000001E0"); 456 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 457 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 458 if (mpfr_cmp(x, x2)) 459 STD_ERROR; 460 if (inexact1 != inexact2) 461 STD_ERROR2; 462 463 mpfr_set_str_binary (y, 464 "0.11000000000000000000000000000000" 465 "000000000000000000000000000001E1"); 466 mpfr_set_str_binary (z, 467 "0.10000000000000000000000000000000" 468 "00000000000000000000000000000001E0"); 469 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 470 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 471 if (mpfr_cmp(x, x2)) 472 STD_ERROR; 473 if (inexact1 != inexact2) 474 STD_ERROR2; 475 476 es = mpfr_get_emin (); 477 set_emin (-1024); 478 479 mpfr_set_str_binary (y, 480 "0.10000000000000000000000000000000" 481 "000000000000000000000000000000E-1023"); 482 mpfr_set_str_binary (z, 483 "0.10000000000000000000000000000000" 484 "00000000000000000000000000000001E-1023"); 485 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 486 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 487 if (mpfr_cmp(x, x2)) 488 STD_ERROR; 489 if (inexact1 != inexact2) 490 STD_ERROR2; 491 492 mpfr_set_str_binary (y, 493 "0.10000000000000000000000000000000" 494 "000000000000000000000000000000E-1023"); 495 mpfr_set_str_binary (z, 496 "0.1000000000000000000000000000000" 497 "000000000000000000000000000000E-1023"); 498 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r); 499 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r); 500 if (mpfr_cmp(x, x2)) 501 STD_ERROR; 502 if (inexact1 != inexact2) 503 STD_ERROR2; 504 505 set_emin (es); 506 } 507 508 mpfr_clears (x, y, z, x2, (mpfr_ptr) 0); 509 } 510