thypot.c revision 1.1 1 1.1 mrg /* Test file for mpfr_hypot.
2 1.1 mrg
3 1.1 mrg Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
4 1.1 mrg Contributed by the Arenaire and Cacao projects, INRIA.
5 1.1 mrg
6 1.1 mrg This file is part of the GNU MPFR Library.
7 1.1 mrg
8 1.1 mrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU Lesser General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3 of the License, or (at your
11 1.1 mrg option) any later version.
12 1.1 mrg
13 1.1 mrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14 1.1 mrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 mrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16 1.1 mrg License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU Lesser General Public License
19 1.1 mrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20 1.1 mrg http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21 1.1 mrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22 1.1 mrg
23 1.1 mrg #include <stdio.h>
24 1.1 mrg #include <limits.h>
25 1.1 mrg #include <stdlib.h>
26 1.1 mrg
27 1.1 mrg #include "mpfr-test.h"
28 1.1 mrg
29 1.1 mrg /* Non-zero when extended exponent range */
30 1.1 mrg static int ext = 0;
31 1.1 mrg
32 1.1 mrg static void
33 1.1 mrg special (void)
34 1.1 mrg {
35 1.1 mrg mpfr_t x, y, z;
36 1.1 mrg
37 1.1 mrg mpfr_init (x);
38 1.1 mrg mpfr_init (y);
39 1.1 mrg mpfr_init (z);
40 1.1 mrg
41 1.1 mrg mpfr_set_nan (x);
42 1.1 mrg mpfr_hypot (z, x, y, MPFR_RNDN);
43 1.1 mrg MPFR_ASSERTN(mpfr_nan_p (z));
44 1.1 mrg
45 1.1 mrg mpfr_set_inf (x, 1);
46 1.1 mrg mpfr_set_inf (y, -1);
47 1.1 mrg mpfr_hypot (z, x, y, MPFR_RNDN);
48 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
49 1.1 mrg
50 1.1 mrg mpfr_set_inf (x, -1);
51 1.1 mrg mpfr_set_nan (y);
52 1.1 mrg mpfr_hypot (z, x, y, MPFR_RNDN);
53 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
54 1.1 mrg
55 1.1 mrg mpfr_set_nan (x);
56 1.1 mrg mpfr_set_inf (y, -1);
57 1.1 mrg mpfr_hypot (z, x, y, MPFR_RNDN);
58 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
59 1.1 mrg
60 1.1 mrg mpfr_clear (x);
61 1.1 mrg mpfr_clear (y);
62 1.1 mrg mpfr_clear (z);
63 1.1 mrg }
64 1.1 mrg
65 1.1 mrg static void
66 1.1 mrg test_large (void)
67 1.1 mrg {
68 1.1 mrg mpfr_t x, y, z, t;
69 1.1 mrg
70 1.1 mrg mpfr_init (x);
71 1.1 mrg mpfr_init (y);
72 1.1 mrg mpfr_init (z);
73 1.1 mrg mpfr_init (t);
74 1.1 mrg
75 1.1 mrg mpfr_set_ui (x, 21, MPFR_RNDN);
76 1.1 mrg mpfr_set_ui (y, 28, MPFR_RNDN);
77 1.1 mrg mpfr_set_ui (z, 35, MPFR_RNDN);
78 1.1 mrg
79 1.1 mrg mpfr_mul_2ui (x, x, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
80 1.1 mrg mpfr_mul_2ui (y, y, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
81 1.1 mrg mpfr_mul_2ui (z, z, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
82 1.1 mrg
83 1.1 mrg mpfr_hypot (t, x, y, MPFR_RNDN);
84 1.1 mrg if (mpfr_cmp (z, t))
85 1.1 mrg {
86 1.1 mrg printf ("Error in test_large: got\n");
87 1.1 mrg mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
88 1.1 mrg printf ("\ninstead of\n");
89 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
90 1.1 mrg printf ("\n");
91 1.1 mrg exit (1);
92 1.1 mrg }
93 1.1 mrg
94 1.1 mrg mpfr_set_prec (x, 53);
95 1.1 mrg mpfr_set_prec (t, 53);
96 1.1 mrg mpfr_set_prec (y, 53);
97 1.1 mrg mpfr_set_str_binary (x, "0.11101100011110000011101000010101010011001101000001100E-1021");
98 1.1 mrg mpfr_set_str_binary (y, "0.11111001010011000001110110001101011100001000010010100E-1021");
99 1.1 mrg mpfr_hypot (t, x, y, MPFR_RNDN);
100 1.1 mrg mpfr_set_str_binary (z, "0.101010111100110111101110111110100110010011001010111E-1020");
101 1.1 mrg if (mpfr_cmp (z, t))
102 1.1 mrg {
103 1.1 mrg printf ("Error in test_large: got\n");
104 1.1 mrg mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
105 1.1 mrg printf ("\ninstead of\n");
106 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
107 1.1 mrg printf ("\n");
108 1.1 mrg exit (1);
109 1.1 mrg }
110 1.1 mrg
111 1.1 mrg mpfr_set_prec (x, 240);
112 1.1 mrg mpfr_set_prec (y, 22);
113 1.1 mrg mpfr_set_prec (z, 2);
114 1.1 mrg mpfr_set_prec (t, 2);
115 1.1 mrg mpfr_set_str_binary (x, "0.100111011010010010110100000100000001100010011100110101101111111101011110111011011101010110100101111000111100010100110000100101011110111011100110100110100101110101101100011000001100000001111101110100100100011011011010110111100110010101000111e-7");
116 1.1 mrg mpfr_set_str_binary (y, "0.1111000010000011000111E-10");
117 1.1 mrg mpfr_hypot (t, x, y, MPFR_RNDN);
118 1.1 mrg mpfr_set_str_binary (z, "0.11E-7");
119 1.1 mrg if (mpfr_cmp (z, t))
120 1.1 mrg {
121 1.1 mrg printf ("Error in test_large: got\n");
122 1.1 mrg mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
123 1.1 mrg printf ("\ninstead of\n");
124 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
125 1.1 mrg printf ("\n");
126 1.1 mrg exit (1);
127 1.1 mrg }
128 1.1 mrg
129 1.1 mrg mpfr_clear (x);
130 1.1 mrg mpfr_clear (y);
131 1.1 mrg mpfr_clear (z);
132 1.1 mrg mpfr_clear (t);
133 1.1 mrg }
134 1.1 mrg
135 1.1 mrg static void
136 1.1 mrg test_small (void)
137 1.1 mrg {
138 1.1 mrg mpfr_t x, y, z1, z2;
139 1.1 mrg int inex1, inex2;
140 1.1 mrg unsigned int flags;
141 1.1 mrg
142 1.1 mrg /* Test hypot(x,x) with x = 2^(emin-1). Result is x * sqrt(2). */
143 1.1 mrg mpfr_inits2 (8, x, y, z1, z2, (mpfr_ptr) 0);
144 1.1 mrg mpfr_set_si_2exp (x, 1, mpfr_get_emin () - 1, MPFR_RNDN);
145 1.1 mrg mpfr_set_si_2exp (y, 1, mpfr_get_emin () - 1, MPFR_RNDN);
146 1.1 mrg mpfr_set_ui (z1, 2, MPFR_RNDN);
147 1.1 mrg inex1 = mpfr_sqrt (z1, z1, MPFR_RNDN);
148 1.1 mrg inex2 = mpfr_mul (z1, z1, x, MPFR_RNDN);
149 1.1 mrg MPFR_ASSERTN (inex2 == 0);
150 1.1 mrg mpfr_clear_flags ();
151 1.1 mrg inex2 = mpfr_hypot (z2, x, y, MPFR_RNDN);
152 1.1 mrg flags = __gmpfr_flags;
153 1.1 mrg if (mpfr_cmp (z1, z2) != 0)
154 1.1 mrg {
155 1.1 mrg printf ("Error in test_small%s\nExpected ",
156 1.1 mrg ext ? ", extended exponent range" : "");
157 1.1 mrg mpfr_out_str (stdout, 2, 0, z1, MPFR_RNDN);
158 1.1 mrg printf ("\nGot ");
159 1.1 mrg mpfr_out_str (stdout, 2, 0, z2, MPFR_RNDN);
160 1.1 mrg printf ("\n");
161 1.1 mrg exit (1);
162 1.1 mrg }
163 1.1 mrg if (! SAME_SIGN (inex1, inex2))
164 1.1 mrg {
165 1.1 mrg printf ("Bad ternary value in test_small%s\nExpected %d, got %d\n",
166 1.1 mrg ext ? ", extended exponent range" : "", inex1, inex2);
167 1.1 mrg exit (1);
168 1.1 mrg }
169 1.1 mrg if (flags != MPFR_FLAGS_INEXACT)
170 1.1 mrg {
171 1.1 mrg printf ("Bad flags in test_small%s\nExpected %u, got %u\n",
172 1.1 mrg ext ? ", extended exponent range" : "",
173 1.1 mrg (unsigned int) MPFR_FLAGS_INEXACT, flags);
174 1.1 mrg exit (1);
175 1.1 mrg }
176 1.1 mrg mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
177 1.1 mrg }
178 1.1 mrg
179 1.1 mrg static void
180 1.1 mrg test_large_small (void)
181 1.1 mrg {
182 1.1 mrg mpfr_t x, y, z;
183 1.1 mrg int inexact, inex2, r;
184 1.1 mrg
185 1.1 mrg mpfr_init2 (x, 3);
186 1.1 mrg mpfr_init2 (y, 2);
187 1.1 mrg mpfr_init2 (z, 2);
188 1.1 mrg
189 1.1 mrg mpfr_set_ui_2exp (x, 1, mpfr_get_emax () / 2, MPFR_RNDN);
190 1.1 mrg mpfr_set_ui_2exp (y, 1, -1, MPFR_RNDN);
191 1.1 mrg inexact = mpfr_hypot (z, x, y, MPFR_RNDN);
192 1.1 mrg if (inexact >= 0 || mpfr_cmp (x, z))
193 1.1 mrg {
194 1.1 mrg printf ("Error 1 in test_large_small%s\n",
195 1.1 mrg ext ? ", extended exponent range" : "");
196 1.1 mrg exit (1);
197 1.1 mrg }
198 1.1 mrg
199 1.1 mrg mpfr_mul_ui (x, x, 5, MPFR_RNDN);
200 1.1 mrg inexact = mpfr_hypot (z, x, y, MPFR_RNDN);
201 1.1 mrg if (mpfr_cmp (x, z) >= 0)
202 1.1 mrg {
203 1.1 mrg printf ("Error 2 in test_large_small%s\n",
204 1.1 mrg ext ? ", extended exponent range" : "");
205 1.1 mrg printf ("x = ");
206 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
207 1.1 mrg printf ("\n");
208 1.1 mrg printf ("y = ");
209 1.1 mrg mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
210 1.1 mrg printf ("\n");
211 1.1 mrg printf ("z = ");
212 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
213 1.1 mrg printf (" (in precision 2) instead of\n ");
214 1.1 mrg mpfr_out_str (stdout, 2, 2, x, MPFR_RNDU);
215 1.1 mrg printf ("\n");
216 1.1 mrg exit (1);
217 1.1 mrg }
218 1.1 mrg
219 1.1 mrg RND_LOOP(r)
220 1.1 mrg {
221 1.1 mrg mpfr_set_ui_2exp (x, 1, mpfr_get_emax () - 1, MPFR_RNDN);
222 1.1 mrg mpfr_set_ui_2exp (y, 1, mpfr_get_emin (), MPFR_RNDN);
223 1.1 mrg inexact = mpfr_hypot (z, x, y, (mpfr_rnd_t) r);
224 1.1 mrg inex2 = mpfr_add_ui (y, x, 1, (mpfr_rnd_t) r);
225 1.1 mrg if (! mpfr_equal_p (y, z) || ! SAME_SIGN (inexact, inex2))
226 1.1 mrg {
227 1.1 mrg printf ("Error 3 in test_large_small, %s%s\n",
228 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r),
229 1.1 mrg ext ? ", extended exponent range" : "");
230 1.1 mrg printf ("Expected ");
231 1.1 mrg mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
232 1.1 mrg printf (", inex = %d\n", inex2);
233 1.1 mrg printf ("Got ");
234 1.1 mrg mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
235 1.1 mrg printf (", inex = %d\n", inexact);
236 1.1 mrg exit (1);
237 1.1 mrg }
238 1.1 mrg }
239 1.1 mrg
240 1.1 mrg mpfr_clear (x);
241 1.1 mrg mpfr_clear (y);
242 1.1 mrg mpfr_clear (z);
243 1.1 mrg }
244 1.1 mrg
245 1.1 mrg static void
246 1.1 mrg check_overflow (void)
247 1.1 mrg {
248 1.1 mrg mpfr_t x, y;
249 1.1 mrg int inex, r;
250 1.1 mrg
251 1.1 mrg mpfr_inits2 (8, x, y, (mpfr_ptr) 0);
252 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
253 1.1 mrg mpfr_setmax (x, mpfr_get_emax ());
254 1.1 mrg
255 1.1 mrg RND_LOOP(r)
256 1.1 mrg {
257 1.1 mrg mpfr_clear_overflow ();
258 1.1 mrg inex = mpfr_hypot (y, x, x, (mpfr_rnd_t) r);
259 1.1 mrg if (!mpfr_overflow_p ())
260 1.1 mrg {
261 1.1 mrg printf ("No overflow in check_overflow for %s%s\n",
262 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r),
263 1.1 mrg ext ? ", extended exponent range" : "");
264 1.1 mrg exit (1);
265 1.1 mrg }
266 1.1 mrg MPFR_ASSERTN (MPFR_IS_POS (y));
267 1.1 mrg if (r == MPFR_RNDZ || r == MPFR_RNDD)
268 1.1 mrg {
269 1.1 mrg MPFR_ASSERTN (inex < 0);
270 1.1 mrg MPFR_ASSERTN (!mpfr_inf_p (y));
271 1.1 mrg mpfr_nexttoinf (y);
272 1.1 mrg }
273 1.1 mrg else
274 1.1 mrg {
275 1.1 mrg MPFR_ASSERTN (inex > 0);
276 1.1 mrg }
277 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (y));
278 1.1 mrg }
279 1.1 mrg
280 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
281 1.1 mrg }
282 1.1 mrg
283 1.1 mrg #define TWO_ARGS
284 1.1 mrg #define TEST_FUNCTION mpfr_hypot
285 1.1 mrg #include "tgeneric.c"
286 1.1 mrg
287 1.1 mrg static void
288 1.1 mrg alltst (void)
289 1.1 mrg {
290 1.1 mrg mpfr_exp_t emin, emax;
291 1.1 mrg
292 1.1 mrg ext = 0;
293 1.1 mrg test_small ();
294 1.1 mrg test_large_small ();
295 1.1 mrg check_overflow ();
296 1.1 mrg
297 1.1 mrg emin = mpfr_get_emin ();
298 1.1 mrg emax = mpfr_get_emax ();
299 1.1 mrg set_emin (MPFR_EMIN_MIN);
300 1.1 mrg set_emax (MPFR_EMAX_MAX);
301 1.1 mrg if (mpfr_get_emin () != emin || mpfr_get_emax () != emax)
302 1.1 mrg {
303 1.1 mrg ext = 1;
304 1.1 mrg test_small ();
305 1.1 mrg test_large_small ();
306 1.1 mrg check_overflow ();
307 1.1 mrg set_emin (emin);
308 1.1 mrg set_emax (emax);
309 1.1 mrg }
310 1.1 mrg }
311 1.1 mrg
312 1.1 mrg int
313 1.1 mrg main (int argc, char *argv[])
314 1.1 mrg {
315 1.1 mrg tests_start_mpfr ();
316 1.1 mrg
317 1.1 mrg special ();
318 1.1 mrg
319 1.1 mrg test_large ();
320 1.1 mrg alltst ();
321 1.1 mrg
322 1.1 mrg test_generic (2, 100, 10);
323 1.1 mrg
324 1.1 mrg tests_end_mpfr ();
325 1.1 mrg return 0;
326 1.1 mrg }
327