1 /* Test file for mpfr_sub1sp.
3 Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 Contributed by the AriC and Caramel projects, INRIA.
6 This file is part of the GNU MPFR Library.
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.
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.
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. */
26 #include "mpfr-test.h"
28 static void check_special (void);
29 static void check_random (mpfr_prec_t p);
39 for (p = 2 ; p < 200 ; p++)
49 printf("ERROR: for %s and p=%lu and i=%d:\nY=", \
50 mpfr_print_rnd_mode ((mpfr_rnd_t) r), (unsigned long) p, i); \
51 mpfr_print_binary(y); \
52 printf("\nZ="); mpfr_print_binary(z); \
53 printf("\nReal: "); mpfr_print_binary(x2); \
54 printf("\nGot : "); mpfr_print_binary(x); \
63 printf("ERROR: for %s and p=%lu and i=%d:\nY=", \
64 mpfr_print_rnd_mode ((mpfr_rnd_t) r), (unsigned long) p, i); \
65 mpfr_print_binary(y); \
66 printf("\nZ="); mpfr_print_binary(z); \
67 printf("\nR="); mpfr_print_binary(x); \
68 printf("\nWrong inexact flag. Real: %d. Got: %d\n", \
69 inexact1, inexact2); \
75 check_random (mpfr_prec_t p)
79 int i, inexact1, inexact2;
81 mpfr_inits2 (p, x, y, z, x2, (mpfr_ptr) 0);
83 for (i = 0 ; i < 500 ; i++)
85 mpfr_urandomb (y, RANDS);
86 mpfr_urandomb (z, RANDS);
87 if (MPFR_IS_PURE_FP(y) && MPFR_IS_PURE_FP(z))
88 for(r = 0 ; r < MPFR_RND_MAX ; r++)
90 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
91 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
94 if (inexact1 != inexact2)
99 mpfr_clears (x, y, z, x2, (mpfr_ptr) 0);
108 int i = -1, inexact1, inexact2;
111 mpfr_inits (x, y, z, x2, (mpfr_ptr) 0);
113 for (r = 0 ; r < MPFR_RND_MAX ; r++)
116 mpfr_set_prec(x, 53);
117 mpfr_set_prec(x2, 53);
118 mpfr_set_prec(y, 53);
119 mpfr_set_prec(z, 53);
121 mpfr_set_str_binary (y,
122 "0.10110111101101110010010010011011000001101101011011001E31");
124 mpfr_sub1sp (x, y, y, (mpfr_rnd_t) r);
125 if (mpfr_cmp_ui(x, 0))
127 printf("Error for x-x with p=%lu. Expected 0. Got:",
129 mpfr_print_binary(x);
133 mpfr_set(z, y, (mpfr_rnd_t) r);
134 mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
135 if (mpfr_cmp_ui(x, 0))
137 printf("Error for x-y with y=x and p=%lu. Expected 0. Got:",
139 mpfr_print_binary(x);
143 mpfr_set_str_binary (y,
144 "0.10110111101101110010010010011011001001101101011011001E31");
145 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
146 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
149 if (inexact1 != inexact2)
153 mpfr_set_str_binary (y,
154 "0.10110111101101110010010010011011000001101101011011001E30");
155 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
156 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
159 if (inexact1 != inexact2)
163 mpfr_set_str_binary (y,
164 "0.10110111101101110010010010011011000101101101011011001E32");
165 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
166 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
169 if (inexact1 != inexact2)
173 mpfr_set_str_binary (y,
174 "0.10110111101101110010010010011011000001101101011011001E63");
175 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
176 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
179 if (inexact1 != inexact2)
183 mpfr_set_str_binary (y,
184 "0.10110111101101110010010010011011010001101101011011001E83");
185 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
186 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
189 if (inexact1 != inexact2)
193 mpfr_set_str_binary (y,
194 "0.10110111101101110010010010011111000001101101011011001E31");
195 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
196 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
199 if (inexact1 != inexact2)
203 mpfr_set_str_binary (y,
204 "0.10110111101101110010010010011011000001101101011011001E331");
205 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
206 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
209 if (inexact1 != inexact2)
212 mpfr_set_str_binary (y,
213 "0.10000000000000000000000000000000000000000000000000000E31");
214 mpfr_set_str_binary (z,
215 "0.11111111111111111111111111111111111111111111111111111E30");
216 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
217 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
220 if (inexact1 != inexact2)
223 mpfr_set_str_binary (y,
224 "0.10000000000000000000000000000000000000000000000000000E31");
225 mpfr_set_str_binary (z,
226 "0.11111111111111111111111111111111111111111111111111111E29");
227 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
228 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
231 if (inexact1 != inexact2)
234 mpfr_set_str_binary (y,
235 "0.10000000000000000000000000000000000000000000000000000E52");
236 mpfr_set_str_binary (z,
237 "0.10000000000010000000000000000000000000000000000000000E00");
238 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
239 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
242 if (inexact1 != inexact2)
245 mpfr_set_str_binary (y,
246 "0.11100000000000000000000000000000000000000000000000000E53");
247 mpfr_set_str_binary (z,
248 "0.10000000000000000000000000000000000000000000000000000E00");
249 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
250 inexact2 = mpfr_sub1sp(z, y, z, (mpfr_rnd_t) r);
251 mpfr_set(x, z, (mpfr_rnd_t) r);
254 if (inexact1 != inexact2)
257 mpfr_set_str_binary (y,
258 "0.10000000000000000000000000000000000000000000000000000E53");
259 mpfr_set_str_binary (z,
260 "0.10100000000000000000000000000000000000000000000000000E00");
261 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
262 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
265 if (inexact1 != inexact2)
268 mpfr_set_str_binary (y,
269 "0.10000000000000000000000000000000000000000000000000000E54");
270 mpfr_set_str_binary (z,
271 "0.10100000000000000000000000000000000000000000000000000E00");
272 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
273 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
276 if (inexact1 != inexact2)
281 mpfr_set_prec(x2, p);
284 mpfr_set_str_binary (y,
285 "0.100000000000000000000000000000000000000000000000000000000000000E62");
286 mpfr_set_str_binary (z,
287 "0.110000000000000000000000000000000000000000000000000000000000000E00");
288 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
289 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
292 if (inexact1 != inexact2)
296 mpfr_set_prec(x, 64);
297 mpfr_set_prec(x2, 64);
298 mpfr_set_prec(y, 64);
299 mpfr_set_prec(z, 64);
301 mpfr_set_str_binary (y,
302 "0.1100000000000000000000000000000000000000000000000000000000000000E31");
303 mpfr_set_str_binary (z,
304 "0.1111111111111111111111111110000000000000000000000000011111111111E29");
305 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
306 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
309 if (inexact1 != inexact2)
312 mpfr_set_str_binary (y,
313 "0.1000000000000000000000000000000000000000000000000000000000000000E63");
314 mpfr_set_str_binary (z,
315 "0.1011000000000000000000000000000000000000000000000000000000000000E00");
316 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
317 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
320 if (inexact1 != inexact2)
323 mpfr_set_str_binary (y,
324 "0.1000000000000000000000000000000000000000000000000000000000000000E63");
325 mpfr_set_str_binary (z,
326 "0.1110000000000000000000000000000000000000000000000000000000000000E00");
327 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
328 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
331 if (inexact1 != inexact2)
334 mpfr_set_str_binary (y,
335 "0.10000000000000000000000000000000000000000000000000000000000000E63");
336 mpfr_set_str_binary (z,
337 "0.10000000000000000000000000000000000000000000000000000000000000E00");
338 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
339 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
342 if (inexact1 != inexact2)
345 mpfr_set_str_binary (y,
346 "0.1000000000000000000000000000000000000000000000000000000000000000E64");
347 mpfr_set_str_binary (z,
348 "0.1010000000000000000000000000000000000000000000000000000000000000E00");
349 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
350 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
353 if (inexact1 != inexact2)
358 mpfr_set_str_binary (y,
359 "0.1000000000000000000000000000000000000000000000000000000000000000"
361 mpfr_set_str_binary (z,
362 "0.1100000000000000000000000000000000000000000000000000000000000000"
364 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
365 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
368 if (inexact1 != inexact2)
373 mpfr_set_prec(x2, p);
377 mpfr_set_str_binary (y, "0.100000000E1");
378 mpfr_set_str_binary (z, "0.100000000E-8");
379 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
380 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
383 if (inexact1 != inexact2)
388 mpfr_set_prec(x2, p);
392 mpfr_set_str_binary (y, "-0.1011110000111100010111011100110100E-18");
393 mpfr_set_str_binary (z, "0.1000101010110011010101011110000000E-14");
394 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
395 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
398 if (inexact1 != inexact2)
403 mpfr_set_prec(x2, p);
407 mpfr_set_str_binary (y,
408 "0.1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E1");
409 mpfr_set_str_binary (z,
410 "0.1011111000100111000011001000011101010101101100101010101001000001110100001101110110001110111010000011101001100010111110001100E-31");
411 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
412 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
415 if (inexact1 != inexact2)
420 mpfr_set_prec(x2, p);
424 mpfr_set_str_binary (y,
425 "0.111000110011000001000111101010111011110011101001101111111110000011100101000001001010110010101010011001010100000001110011110001010101101010001011101110100100001011110100110000101101100011010001001011011010101010000010001101001000110010010111111011110001111101001000101101001100101100101000E80");
426 mpfr_set_str_binary (z,
427 "-0.100001111111101001011010001100110010100111001110000110011101001011010100001000000100111011010110110010000000000010101101011000010000110001110010100001100101011100100100001011000100011110000001010101000100011101001000010111100000111000111011001000100100011000100000010010111000000100100111E-258");
428 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
429 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
432 if (inexact1 != inexact2)
437 mpfr_set_prec(x2, p);
441 mpfr_set_str_binary (y,
442 "0.1111101110100110110110100010101011101001100010100011110110110010010011101100101111100E-4");
443 mpfr_set_str_binary (z,
444 "0.1111101110100110110110100010101001001000011000111000011101100101110100001110101010110E-4");
445 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
446 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
449 if (inexact1 != inexact2)
453 mpfr_set_prec(x, p); mpfr_set_prec(x2, p);
454 mpfr_set_prec(y, p); mpfr_set_prec(z, p);
456 mpfr_set_str_binary (y,
457 "0.11000000000000000000000000000000"
458 "00000000000000000000000000000000E1");
459 mpfr_set_str_binary (z,
460 "0.10000000000000000000000000000000"
461 "00000000000000000000000000000001E0");
462 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
463 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
466 if (inexact1 != inexact2)
469 mpfr_set_str_binary (y,
470 "0.11000000000000000000000000000000"
471 "000000000000000000000000000001E1");
472 mpfr_set_str_binary (z,
473 "0.10000000000000000000000000000000"
474 "00000000000000000000000000000001E0");
475 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
476 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
479 if (inexact1 != inexact2)
482 es = mpfr_get_emin ();
485 mpfr_set_str_binary (y,
486 "0.10000000000000000000000000000000"
487 "000000000000000000000000000000E-1023");
488 mpfr_set_str_binary (z,
489 "0.10000000000000000000000000000000"
490 "00000000000000000000000000000001E-1023");
491 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
492 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
495 if (inexact1 != inexact2)
498 mpfr_set_str_binary (y,
499 "0.10000000000000000000000000000000"
500 "000000000000000000000000000000E-1023");
501 mpfr_set_str_binary (z,
502 "0.1000000000000000000000000000000"
503 "000000000000000000000000000000E-1023");
504 inexact1 = mpfr_sub1(x2, y, z, (mpfr_rnd_t) r);
505 inexact2 = mpfr_sub1sp(x, y, z, (mpfr_rnd_t) r);
508 if (inexact1 != inexact2)
514 mpfr_clears (x, y, z, x2, (mpfr_ptr) 0);