xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tsub1sp.c (revision 4fee23f98c45552038ad6b5bd05124a41302fb01)
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