1 /* tset -- Test file for mpc_set_x and mpc_set_x_x functions.
3 Copyright (C) 2009, 2010, 2011 INRIA
5 This file is part of GNU MPC.
7 GNU MPC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the
9 Free Software Foundation; either version 3 of the License, or (at your
10 option) any later version.
12 GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
17 You should have received a copy of the GNU Lesser General Public License
18 along with this program. If not, see http://www.gnu.org/licenses/ .
22 #include <limits.h> /* for LONG_MAX */
24 #ifdef HAVE_INTTYPES_H
25 # include <inttypes.h> /* for intmax_t */
40 #include "mpc-tests.h"
42 #define PRINT_ERROR(function_name, precision, a) \
44 printf ("Error in "function_name" for prec = %lu\n", \
45 (unsigned long int) precision); \
50 /* test MPC_SET_X_Y through some functions */
52 mpc_set_ui_fr (mpc_ptr z, unsigned long int a, mpfr_srcptr b, mpc_rnd_t rnd)
53 MPC_SET_X_Y (ui, fr, z, a, b, rnd)
56 mpc_set_fr_ui (mpc_ptr z, mpfr_srcptr a, unsigned long int b, mpc_rnd_t rnd)
57 MPC_SET_X_Y (fr, ui, z, a, b, rnd)
60 mpc_set_f_si (mpc_ptr z, mpf_t a, long int b, mpc_rnd_t rnd)
61 MPC_SET_X_Y (f, si, z, a, b, rnd)
77 mpf_init2 (mpf, 1000);
78 mpfr_init2 (fr, 1000);
82 mpz_set_ui (mpz, 0x4217);
83 mpq_set_si (mpq, -1, 0x4321);
86 for (prec = 2; prec <= 1000; prec++)
88 unsigned long int u = (unsigned long int) prec;
90 mpc_set_prec (z, prec);
91 mpfr_set_prec (fr, prec);
95 mpfr_set_d (fr, 1.23456789, GMP_RNDN);
97 mpc_set_d (z, 1.23456789, MPC_RNDNN);
98 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp_si (mpc_imagref(z), 0) != 0)
99 PRINT_ERROR ("mpc_set_d", prec, z);
101 #if defined HAVE_COMPLEX_H
102 mpc_set_dc (z, I*1.23456789+1.23456789, MPC_RNDNN);
103 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0)
104 PRINT_ERROR ("mpc_set_c", prec, z);
107 mpc_set_ui (z, u, MPC_RNDNN);
108 if (mpfr_cmp_ui (mpc_realref(z), u) != 0
109 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0)
110 PRINT_ERROR ("mpc_set_ui", prec, z);
112 mpc_set_d_d (z, 1.23456789, 1.23456789, MPC_RNDNN);
113 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0)
114 PRINT_ERROR ("mpc_set_d_d", prec, z);
116 mpc_set_si (z, lo, MPC_RNDNN);
117 if (mpfr_cmp_si (mpc_realref(z), lo) != 0 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0)
118 PRINT_ERROR ("mpc_set_si", prec, z);
120 mpfr_set_ld (fr, 1.23456789L, GMP_RNDN);
122 mpc_set_ld_ld (z, 1.23456789L, 1.23456789L, MPC_RNDNN);
123 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0)
124 PRINT_ERROR ("mpc_set_ld_ld", prec, z);
126 #if defined HAVE_COMPLEX_H
127 mpc_set_ldc (z, I*1.23456789L+1.23456789L, MPC_RNDNN);
128 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0)
129 PRINT_ERROR ("mpc_set_lc", prec, z);
131 mpc_set_ui_ui (z, u, u, MPC_RNDNN);
132 if (mpfr_cmp_ui (mpc_realref(z), u) != 0
133 || mpfr_cmp_ui (mpc_imagref(z), u) != 0)
134 PRINT_ERROR ("mpc_set_ui_ui", prec, z);
136 mpc_set_ld (z, 1.23456789L, MPC_RNDNN);
138 if (mpfr_cmp (mpc_realref(z), fr) != 0
139 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0
140 || mpfr_erangeflag_p())
141 PRINT_ERROR ("mpc_set_ld", prec, z);
143 mpc_set_prec (x, prec);
144 mpfr_set_ui(fr, 1, GMP_RNDN);
145 mpfr_div_ui(fr, fr, 3, GMP_RNDN);
146 mpfr_set(mpc_realref(x), fr, GMP_RNDN);
147 mpfr_set(mpc_imagref(x), fr, GMP_RNDN);
149 mpc_set (z, x, MPC_RNDNN);
150 mpfr_clear_flags (); /* mpc_cmp set erange flag when an operand is a
152 if (mpc_cmp (z, x) != 0 || mpfr_erangeflag_p())
154 printf ("Error in mpc_set for prec = %lu\n",
155 (unsigned long int) prec);
161 mpc_set_si_si (z, lo, lo, MPC_RNDNN);
162 if (mpfr_cmp_si (mpc_realref(z), lo) != 0
163 || mpfr_cmp_si (mpc_imagref(z), lo) != 0)
164 PRINT_ERROR ("mpc_set_si_si", prec, z);
166 mpc_set_fr (z, fr, MPC_RNDNN);
168 if (mpfr_cmp (mpc_realref(z), fr) != 0
169 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0
170 || mpfr_erangeflag_p())
171 PRINT_ERROR ("mpc_set_fr", prec, z);
173 mpfr_set_z (fr, mpz, GMP_RNDN);
174 mpc_set_z_z (z, mpz, mpz, MPC_RNDNN);
176 if (mpfr_cmp (mpc_realref(z), fr) != 0
177 || mpfr_cmp (mpc_imagref(z), fr) != 0
178 || mpfr_erangeflag_p())
179 PRINT_ERROR ("mpc_set_z_z", prec, z);
181 mpc_set_fr_fr (z, fr, fr, MPC_RNDNN);
183 if (mpfr_cmp (mpc_realref(z), fr) != 0
184 || mpfr_cmp (mpc_imagref(z), fr) != 0
185 || mpfr_erangeflag_p())
186 PRINT_ERROR ("mpc_set_fr_fr", prec, z);
188 mpc_set_z (z, mpz, MPC_RNDNN);
190 if (mpfr_cmp (mpc_realref(z), fr) != 0
191 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0
192 || mpfr_erangeflag_p())
193 PRINT_ERROR ("mpc_set_z", prec, z);
195 mpfr_set_q (fr, mpq, GMP_RNDN);
196 mpc_set_q_q (z, mpq, mpq, MPC_RNDNN);
198 if (mpfr_cmp (mpc_realref(z), fr) != 0
199 || mpfr_cmp (mpc_imagref(z), fr) != 0
200 || mpfr_erangeflag_p())
201 PRINT_ERROR ("mpc_set_q_q", prec, z);
203 mpc_set_ui_fr (z, u, fr, MPC_RNDNN);
205 if (mpfr_cmp_ui (mpc_realref (z), u) != 0
206 || mpfr_cmp (mpc_imagref (z), fr) != 0
207 || mpfr_erangeflag_p ())
208 PRINT_ERROR ("mpc_set_ui_fr", prec, z);
210 mpc_set_fr_ui (z, fr, u, MPC_RNDNN);
212 if (mpfr_cmp (mpc_realref (z), fr) != 0
213 || mpfr_cmp_ui (mpc_imagref (z), u) != 0
214 || mpfr_erangeflag_p())
215 PRINT_ERROR ("mpc_set_fr_ui", prec, z);
217 mpc_set_q (z, mpq, MPC_RNDNN);
219 if (mpfr_cmp (mpc_realref(z), fr) != 0
220 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0
221 || mpfr_erangeflag_p())
222 PRINT_ERROR ("mpc_set_q", prec, z);
224 mpfr_set_f (fr, mpf, GMP_RNDN);
225 mpc_set_f_f (z, mpf, mpf, MPC_RNDNN);
227 if (mpfr_cmp (mpc_realref(z), fr) != 0
228 || mpfr_cmp (mpc_imagref(z), fr) != 0
229 || mpfr_erangeflag_p())
230 PRINT_ERROR ("mpc_set_f_f", prec, z);
232 mpc_set_f (z, mpf, MPC_RNDNN);
234 if (mpfr_cmp (mpc_realref(z), fr) != 0
235 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0
236 || mpfr_erangeflag_p())
237 PRINT_ERROR ("mpc_set_f", prec, z);
239 mpc_set_f_si (z, mpf, lo, MPC_RNDNN);
241 if (mpfr_cmp (mpc_realref (z), fr) != 0
242 || mpfr_cmp_si (mpc_imagref (z), lo) != 0
243 || mpfr_erangeflag_p ())
244 PRINT_ERROR ("mpc_set_f", prec, z);
247 if (!mpfr_nan_p (mpc_realref(z)) || !mpfr_nan_p (mpc_imagref(z)))
248 PRINT_ERROR ("mpc_set_nan", prec, z);
250 #ifdef _MPC_H_HAVE_INTMAX_T
252 uintmax_t uim = (uintmax_t) prec;
253 intmax_t im = (intmax_t) prec;
255 mpc_set_uj (z, uim, MPC_RNDNN);
256 if (mpfr_cmp_ui (mpc_realref(z), u) != 0
257 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0)
258 PRINT_ERROR ("mpc_set_uj", prec, z);
260 mpc_set_sj (z, im, MPC_RNDNN);
261 if (mpfr_cmp_ui (mpc_realref(z), u) != 0
262 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0)
263 PRINT_ERROR ("mpc_set_sj (1)", prec, z);
265 mpc_set_uj_uj (z, uim, uim, MPC_RNDNN);
266 if (mpfr_cmp_ui (mpc_realref(z), u) != 0
267 || mpfr_cmp_ui (mpc_imagref(z), u) != 0)
268 PRINT_ERROR ("mpc_set_uj_uj", prec, z);
270 mpc_set_sj_sj (z, im, im, MPC_RNDNN);
271 if (mpfr_cmp_ui (mpc_realref(z), u) != 0
272 || mpfr_cmp_ui (mpc_imagref(z), u) != 0)
273 PRINT_ERROR ("mpc_set_sj_sj (1)", prec, z);
276 if (sizeof (intmax_t) == 2 * sizeof (unsigned long))
277 im = 2 * im * im + 4 * im + 1; /* gives 2^(2n-1)-1 from 2^(n-1)-1 */
279 mpc_set_sj (z, im, MPC_RNDNN);
280 if (mpfr_get_sj (mpc_realref(z), GMP_RNDN) != im ||
281 mpfr_cmp_ui (mpc_imagref(z), 0) != 0)
282 PRINT_ERROR ("mpc_set_sj (2)", im, z);
284 mpc_set_sj_sj (z, im, im, MPC_RNDNN);
285 if (mpfr_get_sj (mpc_realref(z), GMP_RNDN) != im ||
286 mpfr_get_sj (mpc_imagref(z), GMP_RNDN) != im)
287 PRINT_ERROR ("mpc_set_sj_sj (2)", im, z);
289 #endif /* _MPC_H_HAVE_INTMAX_T */
291 #if defined HAVE_COMPLEX_H
293 double _Complex c = 1.0 - 2.0*I, d;
294 long double _Complex lc = c, ld;
296 mpc_set_dc (z, c, MPC_RNDNN);
297 if ((d = mpc_get_dc (z, MPC_RNDNN)) != c)
299 printf ("expected (%f,%f)\n", creal (c), cimag (c));
300 printf ("got (%f,%f)\n", creal (d), cimag (d));
301 PRINT_ERROR ("mpc_get_dc", prec, z);
303 mpc_set_ldc (z, lc, MPC_RNDNN);
304 if ((ld = mpc_get_ldc (z, MPC_RNDNN)) != lc)
306 printf ("expected (%Lf,%Lf)\n", creall (lc), cimagl (lc));
307 printf ("got (%Lf,%Lf)\n", creall (ld), cimagl (ld));
308 PRINT_ERROR ("mpc_get_ldc", prec, z);
323 check_set_str (mpfr_exp_t exp_max)
333 mpc_init2 (expected, 1024);
334 mpc_init2 (got, 1024);
336 exp_min = mpfr_get_emin ();
338 exp_max = mpfr_get_emax ();
339 else if (exp_max > mpfr_get_emax ())
340 exp_max = mpfr_get_emax();
341 if (-exp_max > exp_min)
344 for (prec = 2; prec < 1024; prec += 7)
346 mpc_set_prec (got, prec);
347 mpc_set_prec (expected, prec);
349 base = 2 + (int) gmp_urandomm_ui (rands, 35);
350 /* uses external variable rands from random.c */
352 mpfr_set_nan (mpc_realref (expected));
353 mpfr_set_inf (mpc_imagref (expected), prec % 2 - 1);
354 str = mpc_get_str (base, 0, expected, MPC_RNDNN);
355 if (mpfr_nan_p (mpc_realref (got)) == 0
356 || mpfr_cmp (mpc_imagref (got), mpc_imagref (expected)) != 0)
358 printf ("Error: mpc_set_str o mpc_get_str != Id\n"
359 "in base %u with str=\"%s\"\n", base, str);
367 test_default_random (expected, exp_min, exp_max, 128, 25);
368 str = mpc_get_str (base, 0, expected, MPC_RNDNN);
369 if (mpc_set_str (got, str, base, MPC_RNDNN) == -1
370 || mpc_cmp (got, expected) != 0)
372 printf ("Error: mpc_set_str o mpc_get_str != Id\n"
373 "in base %u with str=\"%s\"\n", base, str);
382 #ifdef HAVE_SETLOCALE
384 /* Check with ',' as a decimal point */
387 old_locale = setlocale (LC_ALL, "de_DE");
388 if (old_locale != NULL)
390 str = mpc_get_str (10, 0, expected, MPC_RNDNN);
391 if (mpc_set_str (got, str, 10, MPC_RNDNN) == -1
392 || mpc_cmp (got, expected) != 0)
394 printf ("Error: mpc_set_str o mpc_get_str != Id\n"
395 "with str=\"%s\"\n", str);
403 setlocale (LC_ALL, old_locale);
406 #endif /* HAVE_SETLOCALE */
408 /* the real part has a zero exponent in base ten (fixed in r439) */
409 mpc_set_prec (expected, 37);
410 mpc_set_prec (got, 37);
411 mpc_set_str (expected, "921FC04EDp-35 ", 16, GMP_RNDN);
412 str = mpc_get_str (10, 0, expected, MPC_RNDNN);
413 if (mpc_set_str (got, str, 10, MPC_RNDNN) == -1
414 || mpc_cmp (got, expected) != 0)
416 printf ("Error: mpc_set_str o mpc_get_str != Id\n"
417 "with str=\"%s\"\n", str);
425 str = mpc_get_str (1, 0, expected, MPC_RNDNN);
428 printf ("Error: mpc_get_str with base==1 should fail\n");
432 mpc_clear (expected);
442 check_set_str (1024);