1efee5258Smrg /* Test file for mpfr_cmp.
2efee5258Smrg
3*ba125506Smrg Copyright 1999, 2001-2023 Free Software Foundation, Inc.
4efdec83bSmrg Contributed by the AriC and Caramba projects, INRIA.
5efee5258Smrg
6efee5258Smrg This file is part of the GNU MPFR Library.
7efee5258Smrg
8efee5258Smrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9efee5258Smrg it under the terms of the GNU Lesser General Public License as published by
10efee5258Smrg the Free Software Foundation; either version 3 of the License, or (at your
11efee5258Smrg option) any later version.
12efee5258Smrg
13efee5258Smrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14efee5258Smrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15efee5258Smrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16efee5258Smrg License for more details.
17efee5258Smrg
18efee5258Smrg You should have received a copy of the GNU Lesser General Public License
19efee5258Smrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
202ba2404bSmrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21efee5258Smrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22efee5258Smrg
23efee5258Smrg #include "mpfr-test.h"
24efee5258Smrg
25efee5258Smrg int
main(void)26efee5258Smrg main (void)
27efee5258Smrg {
28efee5258Smrg double x, y;
29efee5258Smrg mpfr_t xx, yy;
30efee5258Smrg int c;
31efee5258Smrg long i;
32efee5258Smrg mpfr_prec_t p;
33efee5258Smrg
34efee5258Smrg tests_start_mpfr ();
35efee5258Smrg
36efee5258Smrg mpfr_init (xx);
37efee5258Smrg mpfr_init (yy);
38efee5258Smrg
39efee5258Smrg mpfr_set_prec (xx, 2);
40efee5258Smrg mpfr_set_prec (yy, 2);
41efee5258Smrg mpfr_set_str_binary(xx, "-0.10E0");
42efee5258Smrg mpfr_set_str_binary(yy, "-0.10E0");
43efee5258Smrg if ((mpfr_cmp) (xx, yy))
44efee5258Smrg {
45efee5258Smrg printf ("mpfr_cmp (xx, yy) returns non-zero for prec=2\n");
46efee5258Smrg exit (1);
47efee5258Smrg }
48efee5258Smrg
49efee5258Smrg mpfr_set_prec (xx, 65);
50efee5258Smrg mpfr_set_prec (yy, 65);
51efee5258Smrg mpfr_set_str_binary(xx, "0.10011010101000110101010000000011001001001110001011101011111011101E623");
52efee5258Smrg mpfr_set_str_binary(yy, "0.10011010101000110101010000000011001001001110001011101011111011100E623");
53efee5258Smrg p = 0;
54efee5258Smrg if (mpfr_cmp2 (xx, yy, &p) <= 0 || p != 64)
55efee5258Smrg {
56efee5258Smrg printf ("Error (1) in mpfr_cmp2\n");
57efee5258Smrg exit (1);
58efee5258Smrg }
59efee5258Smrg mpfr_set_str_binary(xx, "0.10100010001110110111000010001000010011111101000100011101000011100");
60efee5258Smrg mpfr_set_str_binary(yy, "0.10100010001110110111000010001000010011111101000100011101000011011");
61efee5258Smrg p = 0;
62efee5258Smrg if (mpfr_cmp2 (xx, yy, &p) <= 0 || p != 64)
63efee5258Smrg {
64efee5258Smrg printf ("Error (2) in mpfr_cmp2\n");
65efee5258Smrg exit (1);
66efee5258Smrg }
67efee5258Smrg
68efee5258Smrg mpfr_set_prec (xx, 160); mpfr_set_prec (yy, 160);
69efee5258Smrg mpfr_set_str_binary (xx, "0.1E1");
70efee5258Smrg mpfr_set_str_binary (yy, "0.1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000110001110100");
71efee5258Smrg p = 0;
72efee5258Smrg if (mpfr_cmp2 (xx, yy, &p) <= 0 || p != 144)
73efee5258Smrg {
74efee5258Smrg printf ("Error (3) in mpfr_cmp2\n");
75efee5258Smrg exit (1);
76efee5258Smrg }
77efee5258Smrg
78efee5258Smrg mpfr_set_prec (xx, 53);
79efee5258Smrg mpfr_set_prec (yy, 200);
80efee5258Smrg mpfr_set_ui (xx, 1, (mpfr_rnd_t) 0);
81efee5258Smrg mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0);
82efee5258Smrg if (mpfr_cmp (xx, yy) != 0)
83efee5258Smrg {
84efee5258Smrg printf ("Error in mpfr_cmp: 1.0 != 1.0\n");
85efee5258Smrg exit (1);
86efee5258Smrg }
87efee5258Smrg mpfr_set_prec (yy, 31);
88efee5258Smrg mpfr_set_str (xx, "1.0000000002", 10, (mpfr_rnd_t) 0);
89efee5258Smrg mpfr_set_ui (yy, 1, (mpfr_rnd_t) 0);
90efee5258Smrg if (!(mpfr_cmp (xx,yy)>0))
91efee5258Smrg {
92efee5258Smrg printf ("Error in mpfr_cmp: not 1.0000000002 > 1.0\n");
93efee5258Smrg exit (1);
94efee5258Smrg }
95efee5258Smrg mpfr_set_prec (yy, 53);
96efee5258Smrg
97efee5258Smrg /* bug found by Gerardo Ballabio */
98efee5258Smrg mpfr_set_ui(xx, 0, MPFR_RNDN);
99efee5258Smrg mpfr_set_str (yy, "0.1", 10, MPFR_RNDN);
100efee5258Smrg if ((c = mpfr_cmp (xx, yy)) >= 0)
101efee5258Smrg {
102efee5258Smrg printf ("Error in mpfr_cmp(0.0, 0.1), gives %d\n", c);
103efee5258Smrg exit (1);
104efee5258Smrg }
105efee5258Smrg
106efee5258Smrg mpfr_set_inf (xx, 1);
107efee5258Smrg mpfr_set_str (yy, "-23489745.0329", 10, MPFR_RNDN);
108efee5258Smrg if ((c = mpfr_cmp (xx, yy)) <= 0)
109efee5258Smrg {
110efee5258Smrg printf ("Error in mpfr_cmp(Infp, 23489745.0329), gives %d\n", c);
111efee5258Smrg exit (1);
112efee5258Smrg }
113efee5258Smrg
114efee5258Smrg mpfr_set_inf (xx, 1);
115efee5258Smrg mpfr_set_inf (yy, -1);
116efee5258Smrg if ((c = mpfr_cmp (xx, yy)) <= 0)
117efee5258Smrg {
118efee5258Smrg printf ("Error in mpfr_cmp(Infp, Infm), gives %d\n", c);
119efee5258Smrg exit (1);
120efee5258Smrg }
121efee5258Smrg
122efee5258Smrg mpfr_set_inf (xx, -1);
123efee5258Smrg mpfr_set_inf (yy, 1);
124efee5258Smrg if ((c = mpfr_cmp (xx, yy)) >= 0)
125efee5258Smrg {
126efee5258Smrg printf ("Error in mpfr_cmp(Infm, Infp), gives %d\n", c);
127efee5258Smrg exit (1);
128efee5258Smrg }
129efee5258Smrg
130efee5258Smrg mpfr_set_inf (xx, 1);
131efee5258Smrg mpfr_set_inf (yy, 1);
132efee5258Smrg if ((c = mpfr_cmp (xx, yy)) != 0)
133efee5258Smrg {
134efee5258Smrg printf ("Error in mpfr_cmp(Infp, Infp), gives %d\n", c);
135efee5258Smrg exit (1);
136efee5258Smrg }
137efee5258Smrg
138efee5258Smrg mpfr_set_inf (xx, -1);
139efee5258Smrg mpfr_set_inf (yy, -1);
140efee5258Smrg if ((c = mpfr_cmp (xx, yy)) != 0)
141efee5258Smrg {
142efee5258Smrg printf ("Error in mpfr_cmp(Infm, Infm), gives %d\n", c);
143efee5258Smrg exit (1);
144efee5258Smrg }
145efee5258Smrg
146efee5258Smrg mpfr_set_inf (xx, -1);
147efee5258Smrg mpfr_set_str (yy, "2346.09234", 10, MPFR_RNDN);
148efee5258Smrg if ((c = mpfr_cmp (xx, yy)) >= 0)
149efee5258Smrg {
150efee5258Smrg printf ("Error in mpfr_cmp(Infm, 2346.09234), gives %d\n", c);
151efee5258Smrg exit (1);
152efee5258Smrg }
153efee5258Smrg
154efee5258Smrg mpfr_set_ui (xx, 0, MPFR_RNDN);
155efee5258Smrg mpfr_set_ui (yy, 1, MPFR_RNDN);
156efee5258Smrg if ((c = mpfr_cmp3 (xx, yy, 1)) >= 0)
157efee5258Smrg {
158efee5258Smrg printf ("Error: mpfr_cmp3 (0, 1, 1) gives %d instead of"
159efee5258Smrg " a negative value\n", c);
160efee5258Smrg exit (1);
161efee5258Smrg }
162efee5258Smrg if ((c = mpfr_cmp3 (xx, yy, -1)) <= 0)
163efee5258Smrg {
164efee5258Smrg printf ("Error: mpfr_cmp3 (0, 1, -1) gives %d instead of"
165efee5258Smrg " a positive value\n", c);
166efee5258Smrg exit (1);
167efee5258Smrg }
168efee5258Smrg
169efee5258Smrg for (i=0; i<500000; )
170efee5258Smrg {
171efee5258Smrg x = DBL_RAND ();
172efee5258Smrg y = DBL_RAND ();
173efee5258Smrg if (!Isnan(x) && !Isnan(y))
174efee5258Smrg {
175efee5258Smrg i++;
176efee5258Smrg mpfr_set_d (xx, x, MPFR_RNDN);
177efee5258Smrg mpfr_set_d (yy, y, MPFR_RNDN);
178efee5258Smrg c = mpfr_cmp (xx,yy);
179efee5258Smrg if ((c>0 && x<=y) || (c==0 && x!=y) || (c<0 && x>=y))
180efee5258Smrg {
181efee5258Smrg printf ("Error in mpfr_cmp with x=%1.20e, y=%1.20e"
182efee5258Smrg " mpfr_cmp(x,y)=%d\n", x, y, c);
183efee5258Smrg exit (1);
184efee5258Smrg }
185efee5258Smrg }
186efee5258Smrg }
187efee5258Smrg
188efee5258Smrg /* Check for NAN */
189efee5258Smrg mpfr_set_nan (xx);
190efee5258Smrg mpfr_clear_erangeflag ();
191efee5258Smrg c = (mpfr_cmp) (xx, yy);
192efee5258Smrg if (c != 0 || !mpfr_erangeflag_p () )
193efee5258Smrg {
194efee5258Smrg printf ("NAN error (1)\n");
195efee5258Smrg exit (1);
196efee5258Smrg }
197efee5258Smrg mpfr_clear_erangeflag ();
198efee5258Smrg c = (mpfr_cmp) (yy, xx);
199efee5258Smrg if (c != 0 || !mpfr_erangeflag_p () )
200efee5258Smrg {
201efee5258Smrg printf ("NAN error (2)\n");
202efee5258Smrg exit (1);
203efee5258Smrg }
204efee5258Smrg mpfr_clear_erangeflag ();
205efee5258Smrg c = (mpfr_cmp) (xx, xx);
206efee5258Smrg if (c != 0 || !mpfr_erangeflag_p () )
207efee5258Smrg {
208efee5258Smrg printf ("NAN error (3)\n");
209efee5258Smrg exit (1);
210efee5258Smrg }
211efee5258Smrg
212efee5258Smrg mpfr_clear (xx);
213efee5258Smrg mpfr_clear (yy);
214efee5258Smrg
215efee5258Smrg tests_end_mpfr ();
216efee5258Smrg return 0;
217efee5258Smrg }
218