thypot.c revision 1.1.1.3 1 1.1 mrg /* Test file for mpfr_hypot.
2 1.1 mrg
3 1.1.1.3 mrg Copyright 2001-2016 Free Software Foundation, Inc.
4 1.1.1.3 mrg Contributed by the AriC and Caramba 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.1.3 mrg mpfr_set_ui (y, 0, MPFR_RNDN);
43 1.1.1.3 mrg mpfr_hypot (z, x, x, MPFR_RNDN);
44 1.1.1.3 mrg MPFR_ASSERTN(mpfr_nan_p (z));
45 1.1 mrg mpfr_hypot (z, x, y, MPFR_RNDN);
46 1.1 mrg MPFR_ASSERTN(mpfr_nan_p (z));
47 1.1.1.3 mrg mpfr_hypot (z, y, x, MPFR_RNDN);
48 1.1.1.3 mrg MPFR_ASSERTN(mpfr_nan_p (z));
49 1.1 mrg
50 1.1 mrg mpfr_set_inf (x, 1);
51 1.1 mrg mpfr_set_inf (y, -1);
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_inf (x, -1);
56 1.1 mrg mpfr_set_nan (y);
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_set_nan (x);
61 1.1 mrg mpfr_set_inf (y, -1);
62 1.1 mrg mpfr_hypot (z, x, y, MPFR_RNDN);
63 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0);
64 1.1 mrg
65 1.1 mrg mpfr_clear (x);
66 1.1 mrg mpfr_clear (y);
67 1.1 mrg mpfr_clear (z);
68 1.1 mrg }
69 1.1 mrg
70 1.1 mrg static void
71 1.1 mrg test_large (void)
72 1.1 mrg {
73 1.1 mrg mpfr_t x, y, z, t;
74 1.1 mrg
75 1.1 mrg mpfr_init (x);
76 1.1 mrg mpfr_init (y);
77 1.1 mrg mpfr_init (z);
78 1.1 mrg mpfr_init (t);
79 1.1 mrg
80 1.1 mrg mpfr_set_ui (x, 21, MPFR_RNDN);
81 1.1 mrg mpfr_set_ui (y, 28, MPFR_RNDN);
82 1.1 mrg mpfr_set_ui (z, 35, MPFR_RNDN);
83 1.1 mrg
84 1.1 mrg mpfr_mul_2ui (x, x, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
85 1.1 mrg mpfr_mul_2ui (y, y, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
86 1.1 mrg mpfr_mul_2ui (z, z, MPFR_EMAX_DEFAULT-6, MPFR_RNDN);
87 1.1 mrg
88 1.1 mrg mpfr_hypot (t, x, y, MPFR_RNDN);
89 1.1 mrg if (mpfr_cmp (z, t))
90 1.1 mrg {
91 1.1 mrg printf ("Error in test_large: got\n");
92 1.1 mrg mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
93 1.1 mrg printf ("\ninstead of\n");
94 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
95 1.1 mrg printf ("\n");
96 1.1 mrg exit (1);
97 1.1 mrg }
98 1.1 mrg
99 1.1 mrg mpfr_set_prec (x, 53);
100 1.1 mrg mpfr_set_prec (t, 53);
101 1.1 mrg mpfr_set_prec (y, 53);
102 1.1 mrg mpfr_set_str_binary (x, "0.11101100011110000011101000010101010011001101000001100E-1021");
103 1.1 mrg mpfr_set_str_binary (y, "0.11111001010011000001110110001101011100001000010010100E-1021");
104 1.1 mrg mpfr_hypot (t, x, y, MPFR_RNDN);
105 1.1 mrg mpfr_set_str_binary (z, "0.101010111100110111101110111110100110010011001010111E-1020");
106 1.1 mrg if (mpfr_cmp (z, t))
107 1.1 mrg {
108 1.1 mrg printf ("Error in test_large: got\n");
109 1.1 mrg mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
110 1.1 mrg printf ("\ninstead of\n");
111 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
112 1.1 mrg printf ("\n");
113 1.1 mrg exit (1);
114 1.1 mrg }
115 1.1 mrg
116 1.1 mrg mpfr_set_prec (x, 240);
117 1.1 mrg mpfr_set_prec (y, 22);
118 1.1 mrg mpfr_set_prec (z, 2);
119 1.1 mrg mpfr_set_prec (t, 2);
120 1.1 mrg mpfr_set_str_binary (x, "0.100111011010010010110100000100000001100010011100110101101111111101011110111011011101010110100101111000111100010100110000100101011110111011100110100110100101110101101100011000001100000001111101110100100100011011011010110111100110010101000111e-7");
121 1.1 mrg mpfr_set_str_binary (y, "0.1111000010000011000111E-10");
122 1.1 mrg mpfr_hypot (t, x, y, MPFR_RNDN);
123 1.1 mrg mpfr_set_str_binary (z, "0.11E-7");
124 1.1 mrg if (mpfr_cmp (z, t))
125 1.1 mrg {
126 1.1 mrg printf ("Error in test_large: got\n");
127 1.1 mrg mpfr_out_str (stdout, 2, 0, t, MPFR_RNDN);
128 1.1 mrg printf ("\ninstead of\n");
129 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
130 1.1 mrg printf ("\n");
131 1.1 mrg exit (1);
132 1.1 mrg }
133 1.1 mrg
134 1.1 mrg mpfr_clear (x);
135 1.1 mrg mpfr_clear (y);
136 1.1 mrg mpfr_clear (z);
137 1.1 mrg mpfr_clear (t);
138 1.1 mrg }
139 1.1 mrg
140 1.1 mrg static void
141 1.1 mrg test_small (void)
142 1.1 mrg {
143 1.1 mrg mpfr_t x, y, z1, z2;
144 1.1 mrg int inex1, inex2;
145 1.1 mrg unsigned int flags;
146 1.1 mrg
147 1.1 mrg /* Test hypot(x,x) with x = 2^(emin-1). Result is x * sqrt(2). */
148 1.1 mrg mpfr_inits2 (8, x, y, z1, z2, (mpfr_ptr) 0);
149 1.1 mrg mpfr_set_si_2exp (x, 1, mpfr_get_emin () - 1, MPFR_RNDN);
150 1.1 mrg mpfr_set_si_2exp (y, 1, mpfr_get_emin () - 1, MPFR_RNDN);
151 1.1 mrg mpfr_set_ui (z1, 2, MPFR_RNDN);
152 1.1 mrg inex1 = mpfr_sqrt (z1, z1, MPFR_RNDN);
153 1.1 mrg inex2 = mpfr_mul (z1, z1, x, MPFR_RNDN);
154 1.1 mrg MPFR_ASSERTN (inex2 == 0);
155 1.1 mrg mpfr_clear_flags ();
156 1.1 mrg inex2 = mpfr_hypot (z2, x, y, MPFR_RNDN);
157 1.1 mrg flags = __gmpfr_flags;
158 1.1 mrg if (mpfr_cmp (z1, z2) != 0)
159 1.1 mrg {
160 1.1 mrg printf ("Error in test_small%s\nExpected ",
161 1.1 mrg ext ? ", extended exponent range" : "");
162 1.1 mrg mpfr_out_str (stdout, 2, 0, z1, MPFR_RNDN);
163 1.1 mrg printf ("\nGot ");
164 1.1 mrg mpfr_out_str (stdout, 2, 0, z2, MPFR_RNDN);
165 1.1 mrg printf ("\n");
166 1.1 mrg exit (1);
167 1.1 mrg }
168 1.1 mrg if (! SAME_SIGN (inex1, inex2))
169 1.1 mrg {
170 1.1 mrg printf ("Bad ternary value in test_small%s\nExpected %d, got %d\n",
171 1.1 mrg ext ? ", extended exponent range" : "", inex1, inex2);
172 1.1 mrg exit (1);
173 1.1 mrg }
174 1.1 mrg if (flags != MPFR_FLAGS_INEXACT)
175 1.1 mrg {
176 1.1 mrg printf ("Bad flags in test_small%s\nExpected %u, got %u\n",
177 1.1 mrg ext ? ", extended exponent range" : "",
178 1.1 mrg (unsigned int) MPFR_FLAGS_INEXACT, flags);
179 1.1 mrg exit (1);
180 1.1 mrg }
181 1.1 mrg mpfr_clears (x, y, z1, z2, (mpfr_ptr) 0);
182 1.1 mrg }
183 1.1 mrg
184 1.1 mrg static void
185 1.1 mrg test_large_small (void)
186 1.1 mrg {
187 1.1 mrg mpfr_t x, y, z;
188 1.1 mrg int inexact, inex2, r;
189 1.1 mrg
190 1.1 mrg mpfr_init2 (x, 3);
191 1.1 mrg mpfr_init2 (y, 2);
192 1.1 mrg mpfr_init2 (z, 2);
193 1.1 mrg
194 1.1 mrg mpfr_set_ui_2exp (x, 1, mpfr_get_emax () / 2, MPFR_RNDN);
195 1.1 mrg mpfr_set_ui_2exp (y, 1, -1, MPFR_RNDN);
196 1.1 mrg inexact = mpfr_hypot (z, x, y, MPFR_RNDN);
197 1.1 mrg if (inexact >= 0 || mpfr_cmp (x, z))
198 1.1 mrg {
199 1.1 mrg printf ("Error 1 in test_large_small%s\n",
200 1.1 mrg ext ? ", extended exponent range" : "");
201 1.1 mrg exit (1);
202 1.1 mrg }
203 1.1 mrg
204 1.1 mrg mpfr_mul_ui (x, x, 5, MPFR_RNDN);
205 1.1 mrg inexact = mpfr_hypot (z, x, y, MPFR_RNDN);
206 1.1 mrg if (mpfr_cmp (x, z) >= 0)
207 1.1 mrg {
208 1.1 mrg printf ("Error 2 in test_large_small%s\n",
209 1.1 mrg ext ? ", extended exponent range" : "");
210 1.1 mrg printf ("x = ");
211 1.1 mrg mpfr_out_str (stdout, 2, 0, x, MPFR_RNDN);
212 1.1 mrg printf ("\n");
213 1.1 mrg printf ("y = ");
214 1.1 mrg mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
215 1.1 mrg printf ("\n");
216 1.1 mrg printf ("z = ");
217 1.1 mrg mpfr_out_str (stdout, 2, 0, z, MPFR_RNDN);
218 1.1 mrg printf (" (in precision 2) instead of\n ");
219 1.1 mrg mpfr_out_str (stdout, 2, 2, x, MPFR_RNDU);
220 1.1 mrg printf ("\n");
221 1.1 mrg exit (1);
222 1.1 mrg }
223 1.1 mrg
224 1.1 mrg RND_LOOP(r)
225 1.1 mrg {
226 1.1 mrg mpfr_set_ui_2exp (x, 1, mpfr_get_emax () - 1, MPFR_RNDN);
227 1.1 mrg mpfr_set_ui_2exp (y, 1, mpfr_get_emin (), MPFR_RNDN);
228 1.1 mrg inexact = mpfr_hypot (z, x, y, (mpfr_rnd_t) r);
229 1.1 mrg inex2 = mpfr_add_ui (y, x, 1, (mpfr_rnd_t) r);
230 1.1 mrg if (! mpfr_equal_p (y, z) || ! SAME_SIGN (inexact, inex2))
231 1.1 mrg {
232 1.1 mrg printf ("Error 3 in test_large_small, %s%s\n",
233 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r),
234 1.1 mrg ext ? ", extended exponent range" : "");
235 1.1 mrg printf ("Expected ");
236 1.1 mrg mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
237 1.1 mrg printf (", inex = %d\n", inex2);
238 1.1 mrg printf ("Got ");
239 1.1 mrg mpfr_out_str (stdout, 2, 0, y, MPFR_RNDN);
240 1.1 mrg printf (", inex = %d\n", inexact);
241 1.1 mrg exit (1);
242 1.1 mrg }
243 1.1 mrg }
244 1.1 mrg
245 1.1 mrg mpfr_clear (x);
246 1.1 mrg mpfr_clear (y);
247 1.1 mrg mpfr_clear (z);
248 1.1 mrg }
249 1.1 mrg
250 1.1 mrg static void
251 1.1 mrg check_overflow (void)
252 1.1 mrg {
253 1.1 mrg mpfr_t x, y;
254 1.1 mrg int inex, r;
255 1.1 mrg
256 1.1 mrg mpfr_inits2 (8, x, y, (mpfr_ptr) 0);
257 1.1 mrg mpfr_set_ui (x, 1, MPFR_RNDN);
258 1.1 mrg mpfr_setmax (x, mpfr_get_emax ());
259 1.1 mrg
260 1.1 mrg RND_LOOP(r)
261 1.1 mrg {
262 1.1 mrg mpfr_clear_overflow ();
263 1.1 mrg inex = mpfr_hypot (y, x, x, (mpfr_rnd_t) r);
264 1.1 mrg if (!mpfr_overflow_p ())
265 1.1 mrg {
266 1.1 mrg printf ("No overflow in check_overflow for %s%s\n",
267 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r),
268 1.1 mrg ext ? ", extended exponent range" : "");
269 1.1 mrg exit (1);
270 1.1 mrg }
271 1.1 mrg MPFR_ASSERTN (MPFR_IS_POS (y));
272 1.1 mrg if (r == MPFR_RNDZ || r == MPFR_RNDD)
273 1.1 mrg {
274 1.1 mrg MPFR_ASSERTN (inex < 0);
275 1.1 mrg MPFR_ASSERTN (!mpfr_inf_p (y));
276 1.1 mrg mpfr_nexttoinf (y);
277 1.1 mrg }
278 1.1 mrg else
279 1.1 mrg {
280 1.1 mrg MPFR_ASSERTN (inex > 0);
281 1.1 mrg }
282 1.1 mrg MPFR_ASSERTN (mpfr_inf_p (y));
283 1.1 mrg }
284 1.1 mrg
285 1.1 mrg mpfr_clears (x, y, (mpfr_ptr) 0);
286 1.1 mrg }
287 1.1 mrg
288 1.1 mrg #define TWO_ARGS
289 1.1 mrg #define TEST_FUNCTION mpfr_hypot
290 1.1 mrg #include "tgeneric.c"
291 1.1 mrg
292 1.1 mrg static void
293 1.1 mrg alltst (void)
294 1.1 mrg {
295 1.1 mrg mpfr_exp_t emin, emax;
296 1.1 mrg
297 1.1 mrg ext = 0;
298 1.1 mrg test_small ();
299 1.1 mrg test_large_small ();
300 1.1 mrg check_overflow ();
301 1.1 mrg
302 1.1 mrg emin = mpfr_get_emin ();
303 1.1 mrg emax = mpfr_get_emax ();
304 1.1 mrg set_emin (MPFR_EMIN_MIN);
305 1.1 mrg set_emax (MPFR_EMAX_MAX);
306 1.1 mrg if (mpfr_get_emin () != emin || mpfr_get_emax () != emax)
307 1.1 mrg {
308 1.1 mrg ext = 1;
309 1.1 mrg test_small ();
310 1.1 mrg test_large_small ();
311 1.1 mrg check_overflow ();
312 1.1 mrg set_emin (emin);
313 1.1 mrg set_emax (emax);
314 1.1 mrg }
315 1.1 mrg }
316 1.1 mrg
317 1.1 mrg int
318 1.1 mrg main (int argc, char *argv[])
319 1.1 mrg {
320 1.1 mrg tests_start_mpfr ();
321 1.1 mrg
322 1.1 mrg special ();
323 1.1 mrg
324 1.1 mrg test_large ();
325 1.1 mrg alltst ();
326 1.1 mrg
327 1.1 mrg test_generic (2, 100, 10);
328 1.1 mrg
329 1.1 mrg tests_end_mpfr ();
330 1.1 mrg return 0;
331 1.1 mrg }
332