tset.c revision 1.1.1.3
1/* tset -- Test file for mpc_set_x and mpc_set_x_x functions. 2 3Copyright (C) 2009, 2010, 2011, 2012, 2022 INRIA 4 5This file is part of GNU MPC. 6 7GNU MPC is free software; you can redistribute it and/or modify it under 8the terms of the GNU Lesser General Public License as published by the 9Free Software Foundation; either version 3 of the License, or (at your 10option) any later version. 11 12GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 15more details. 16 17You should have received a copy of the GNU Lesser General Public License 18along with this program. If not, see http://www.gnu.org/licenses/ . 19*/ 20 21#include "config.h" 22#include <locale.h> 23#include <limits.h> /* for LONG_MAX */ 24 25#ifdef HAVE_INTTYPES_H 26# include <inttypes.h> /* for intmax_t */ 27#else 28# ifdef HAVE_STDINT_H 29# include <stdint.h> 30# endif 31#endif 32 33#ifdef HAVE_COMPLEX_H 34# include <complex.h> 35#endif 36 37#include "mpc-tests.h" 38 39#define PRINT_ERROR(function_name, precision, a) \ 40 do { \ 41 printf ("Error in " function_name " for prec = %lu\n", \ 42 (unsigned long int) precision); \ 43 MPC_OUT(a); \ 44 exit (1); \ 45 } while (0) 46 47/* test MPC_SET_X_Y through some functions */ 48static int 49mpc_set_ui_fr (mpc_ptr z, unsigned long int a, mpfr_srcptr b, mpc_rnd_t rnd) 50 MPC_SET_X_Y (ui, fr, z, a, b, rnd) 51 52static int 53mpc_set_fr_ui (mpc_ptr z, mpfr_srcptr a, unsigned long int b, mpc_rnd_t rnd) 54 MPC_SET_X_Y (fr, ui, z, a, b, rnd) 55 56static int 57mpc_set_f_si (mpc_ptr z, mpf_t a, long int b, mpc_rnd_t rnd) 58 MPC_SET_X_Y (f, si, z, a, b, rnd) 59 60 61static void 62check_set (void) 63{ 64 long int lo; 65 mpz_t mpz; 66 mpq_t mpq; 67 mpf_t mpf; 68 mpfr_t fr; 69 mpc_t x, z; 70 mpfr_prec_t prec; 71 72 mpz_init (mpz); 73 mpq_init (mpq); 74 mpf_init2 (mpf, 1000); 75 mpfr_init2 (fr, 1000); 76 mpc_init2 (x, 1000); 77 mpc_init2 (z, 1000); 78 79 mpz_set_ui (mpz, 0x4217); 80 mpq_set_si (mpq, -1, 0x4321); 81 mpf_set_q (mpf, mpq); 82 83 for (prec = 2; prec <= 1000; prec++) 84 { 85 unsigned long int u = (unsigned long int) prec; 86 87 mpc_set_prec (z, prec); 88 mpfr_set_prec (fr, prec); 89 90 lo = -prec; 91 92 mpfr_set_d (fr, 1.23456789, MPFR_RNDN); 93 94 mpc_set_d (z, 1.23456789, MPC_RNDNN); 95 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp_si (mpc_imagref(z), 0) != 0) 96 PRINT_ERROR ("mpc_set_d", prec, z); 97 98#if defined HAVE_COMPLEX_H 99 mpc_set_dc (z, I*1.23456789+1.23456789, MPC_RNDNN); 100 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0) 101 PRINT_ERROR ("mpc_set_c", prec, z); 102#endif 103 104 mpc_set_ui (z, u, MPC_RNDNN); 105 if (mpfr_cmp_ui (mpc_realref(z), u) != 0 106 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0) 107 PRINT_ERROR ("mpc_set_ui", prec, z); 108 109 mpc_set_d_d (z, 1.23456789, 1.23456789, MPC_RNDNN); 110 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0) 111 PRINT_ERROR ("mpc_set_d_d", prec, z); 112 113 mpc_set_si (z, lo, MPC_RNDNN); 114 if (mpfr_cmp_si (mpc_realref(z), lo) != 0 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0) 115 PRINT_ERROR ("mpc_set_si", prec, z); 116 117 mpfr_set_ld (fr, 1.23456789L, MPFR_RNDN); 118 119 mpc_set_ld_ld (z, 1.23456789L, 1.23456789L, MPC_RNDNN); 120 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0) 121 PRINT_ERROR ("mpc_set_ld_ld", prec, z); 122 123#if defined HAVE_COMPLEX_H 124 mpc_set_ldc (z, I*1.23456789L+1.23456789L, MPC_RNDNN); 125 if (mpfr_cmp (mpc_realref(z), fr) != 0 || mpfr_cmp (mpc_imagref(z), fr) != 0) 126 PRINT_ERROR ("mpc_set_lc", prec, z); 127#endif 128 mpc_set_ui_ui (z, u, u, MPC_RNDNN); 129 if (mpfr_cmp_ui (mpc_realref(z), u) != 0 130 || mpfr_cmp_ui (mpc_imagref(z), u) != 0) 131 PRINT_ERROR ("mpc_set_ui_ui", prec, z); 132 133 mpc_set_ld (z, 1.23456789L, MPC_RNDNN); 134 mpfr_clear_flags (); 135 if (mpfr_cmp (mpc_realref(z), fr) != 0 136 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0 137 || mpfr_erangeflag_p()) 138 PRINT_ERROR ("mpc_set_ld", prec, z); 139 140 mpc_set_prec (x, prec); 141 mpfr_set_ui(fr, 1, MPFR_RNDN); 142 mpfr_div_ui(fr, fr, 3, MPFR_RNDN); 143 mpfr_set(mpc_realref(x), fr, MPFR_RNDN); 144 mpfr_set(mpc_imagref(x), fr, MPFR_RNDN); 145 146 mpc_set (z, x, MPC_RNDNN); 147 mpfr_clear_flags (); /* mpc_cmp set erange flag when an operand is a 148 NaN */ 149 if (mpc_cmp (z, x) != 0 || mpfr_erangeflag_p()) 150 { 151 printf ("Error in mpc_set for prec = %lu\n", 152 (unsigned long int) prec); 153 MPC_OUT(z); 154 MPC_OUT(x); 155 exit (1); 156 } 157 158 mpc_set_si_si (z, lo, lo, MPC_RNDNN); 159 if (mpfr_cmp_si (mpc_realref(z), lo) != 0 160 || mpfr_cmp_si (mpc_imagref(z), lo) != 0) 161 PRINT_ERROR ("mpc_set_si_si", prec, z); 162 163 mpc_set_fr (z, fr, MPC_RNDNN); 164 mpfr_clear_flags (); 165 if (mpfr_cmp (mpc_realref(z), fr) != 0 166 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0 167 || mpfr_erangeflag_p()) 168 PRINT_ERROR ("mpc_set_fr", prec, z); 169 170 mpfr_set_z (fr, mpz, MPFR_RNDN); 171 mpc_set_z_z (z, mpz, mpz, MPC_RNDNN); 172 mpfr_clear_flags (); 173 if (mpfr_cmp (mpc_realref(z), fr) != 0 174 || mpfr_cmp (mpc_imagref(z), fr) != 0 175 || mpfr_erangeflag_p()) 176 PRINT_ERROR ("mpc_set_z_z", prec, z); 177 178 mpc_set_fr_fr (z, fr, fr, MPC_RNDNN); 179 mpfr_clear_flags (); 180 if (mpfr_cmp (mpc_realref(z), fr) != 0 181 || mpfr_cmp (mpc_imagref(z), fr) != 0 182 || mpfr_erangeflag_p()) 183 PRINT_ERROR ("mpc_set_fr_fr", prec, z); 184 185 mpc_set_z (z, mpz, MPC_RNDNN); 186 mpfr_clear_flags (); 187 if (mpfr_cmp (mpc_realref(z), fr) != 0 188 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0 189 || mpfr_erangeflag_p()) 190 PRINT_ERROR ("mpc_set_z", prec, z); 191 192 mpfr_set_q (fr, mpq, MPFR_RNDN); 193 mpc_set_q_q (z, mpq, mpq, MPC_RNDNN); 194 mpfr_clear_flags (); 195 if (mpfr_cmp (mpc_realref(z), fr) != 0 196 || mpfr_cmp (mpc_imagref(z), fr) != 0 197 || mpfr_erangeflag_p()) 198 PRINT_ERROR ("mpc_set_q_q", prec, z); 199 200 mpc_set_ui_fr (z, u, fr, MPC_RNDNN); 201 mpfr_clear_flags (); 202 if (mpfr_cmp_ui (mpc_realref (z), u) != 0 203 || mpfr_cmp (mpc_imagref (z), fr) != 0 204 || mpfr_erangeflag_p ()) 205 PRINT_ERROR ("mpc_set_ui_fr", prec, z); 206 207 mpc_set_fr_ui (z, fr, u, MPC_RNDNN); 208 mpfr_clear_flags (); 209 if (mpfr_cmp (mpc_realref (z), fr) != 0 210 || mpfr_cmp_ui (mpc_imagref (z), u) != 0 211 || mpfr_erangeflag_p()) 212 PRINT_ERROR ("mpc_set_fr_ui", prec, z); 213 214 mpc_set_q (z, mpq, MPC_RNDNN); 215 mpfr_clear_flags (); 216 if (mpfr_cmp (mpc_realref(z), fr) != 0 217 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0 218 || mpfr_erangeflag_p()) 219 PRINT_ERROR ("mpc_set_q", prec, z); 220 221 mpfr_set_f (fr, mpf, MPFR_RNDN); 222 mpc_set_f_f (z, mpf, mpf, MPC_RNDNN); 223 mpfr_clear_flags (); 224 if (mpfr_cmp (mpc_realref(z), fr) != 0 225 || mpfr_cmp (mpc_imagref(z), fr) != 0 226 || mpfr_erangeflag_p()) 227 PRINT_ERROR ("mpc_set_f_f", prec, z); 228 229 mpc_set_f (z, mpf, MPC_RNDNN); 230 mpfr_clear_flags (); 231 if (mpfr_cmp (mpc_realref(z), fr) != 0 232 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0 233 || mpfr_erangeflag_p()) 234 PRINT_ERROR ("mpc_set_f", prec, z); 235 236 mpc_set_f_si (z, mpf, lo, MPC_RNDNN); 237 mpfr_clear_flags (); 238 if (mpfr_cmp (mpc_realref (z), fr) != 0 239 || mpfr_cmp_si (mpc_imagref (z), lo) != 0 240 || mpfr_erangeflag_p ()) 241 PRINT_ERROR ("mpc_set_f", prec, z); 242 243 mpc_set_nan (z); 244 if (!mpfr_nan_p (mpc_realref(z)) || !mpfr_nan_p (mpc_imagref(z))) 245 PRINT_ERROR ("mpc_set_nan", prec, z); 246 247#ifdef _MPC_H_HAVE_INTMAX_T 248 { 249 uintmax_t uim = (uintmax_t) prec; 250 intmax_t im = (intmax_t) prec; 251 252 mpc_set_uj (z, uim, MPC_RNDNN); 253 if (mpfr_cmp_ui (mpc_realref(z), u) != 0 254 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0) 255 PRINT_ERROR ("mpc_set_uj", prec, z); 256 257 mpc_set_sj (z, im, MPC_RNDNN); 258 if (mpfr_cmp_ui (mpc_realref(z), u) != 0 259 || mpfr_cmp_ui (mpc_imagref(z), 0) != 0) 260 PRINT_ERROR ("mpc_set_sj (1)", prec, z); 261 262 mpc_set_uj_uj (z, uim, uim, MPC_RNDNN); 263 if (mpfr_cmp_ui (mpc_realref(z), u) != 0 264 || mpfr_cmp_ui (mpc_imagref(z), u) != 0) 265 PRINT_ERROR ("mpc_set_uj_uj", prec, z); 266 267 mpc_set_sj_sj (z, im, im, MPC_RNDNN); 268 if (mpfr_cmp_ui (mpc_realref(z), u) != 0 269 || mpfr_cmp_ui (mpc_imagref(z), u) != 0) 270 PRINT_ERROR ("mpc_set_sj_sj (1)", prec, z); 271 272 im = LONG_MAX; 273 if (sizeof (intmax_t) == 2 * sizeof (unsigned long)) 274 im = 2 * im * im + 4 * im + 1; /* gives 2^(2n-1)-1 from 2^(n-1)-1 */ 275 276 mpc_set_sj (z, im, MPC_RNDNN); 277 if (mpfr_get_sj (mpc_realref(z), MPFR_RNDN) != im || 278 mpfr_cmp_ui (mpc_imagref(z), 0) != 0) 279 PRINT_ERROR ("mpc_set_sj (2)", im, z); 280 281 mpc_set_sj_sj (z, im, im, MPC_RNDNN); 282 if (mpfr_get_sj (mpc_realref(z), MPFR_RNDN) != im || 283 mpfr_get_sj (mpc_imagref(z), MPFR_RNDN) != im) 284 PRINT_ERROR ("mpc_set_sj_sj (2)", im, z); 285 } 286#endif /* _MPC_H_HAVE_INTMAX_T */ 287 288#if defined HAVE_COMPLEX_H 289 { 290 double _Complex c = 1.0 - 2.0*I, d; 291 long double _Complex lc = c, ld; 292 293 mpc_set_dc (z, c, MPC_RNDNN); 294 if ((d = mpc_get_dc (z, MPC_RNDNN)) != c) 295 { 296 printf ("expected (%f,%f)\n", creal (c), cimag (c)); 297 printf ("got (%f,%f)\n", creal (d), cimag (d)); 298 PRINT_ERROR ("mpc_get_dc", prec, z); 299 } 300 mpc_set_ldc (z, lc, MPC_RNDNN); 301 if ((ld = mpc_get_ldc (z, MPC_RNDNN)) != lc) 302 { 303 printf ("expected (%Lf,%Lf)\n", creall (lc), cimagl (lc)); 304 printf ("got (%Lf,%Lf)\n", creall (ld), cimagl (ld)); 305 PRINT_ERROR ("mpc_get_ldc", prec, z); 306 } 307 } 308#endif 309 } 310 311 mpz_clear (mpz); 312 mpq_clear (mpq); 313 mpf_clear (mpf); 314 mpfr_clear (fr); 315 mpc_clear (x); 316 mpc_clear (z); 317} 318 319static void 320check_set_str (mpfr_exp_t exp_max) 321{ 322 mpc_t expected; 323 mpc_t got; 324 char *str; 325 326 mpfr_prec_t prec; 327 mpfr_exp_t exp_min; 328 int base; 329 330 mpc_init2 (expected, 1024); 331 mpc_init2 (got, 1024); 332 333 exp_min = mpfr_get_emin (); 334 if (exp_max <= 0) 335 exp_max = mpfr_get_emax (); 336 else if (exp_max > mpfr_get_emax ()) 337 exp_max = mpfr_get_emax(); 338 if (-exp_max > exp_min) 339 exp_min = - exp_max; 340 341 for (prec = 2; prec < 1024; prec += 7) 342 { 343 mpc_set_prec (got, prec); 344 mpc_set_prec (expected, prec); 345 346 base = 2 + (int) gmp_urandomm_ui (rands, 35); 347 /* uses external variable rands from random.c */ 348 349 mpfr_set_nan (mpc_realref (expected)); 350 mpfr_set_inf (mpc_imagref (expected), prec % 2 - 1); 351 str = mpc_get_str (base, 0, expected, MPC_RNDNN); 352 if (mpfr_nan_p (mpc_realref (got)) == 0 353 || mpfr_cmp (mpc_imagref (got), mpc_imagref (expected)) != 0) 354 { 355 printf ("Error: mpc_set_str o mpc_get_str != Id\n" 356 "in base %u with str=\"%s\"\n", base, str); 357 MPC_OUT (expected); 358 printf (" "); 359 MPC_OUT (got); 360 exit (1); 361 } 362 mpc_free_str (str); 363 364 test_default_random (expected, exp_min, exp_max, 128, 25); 365 str = mpc_get_str (base, 0, expected, MPC_RNDNN); 366 if (mpc_set_str (got, str, base, MPC_RNDNN) == -1 367 || mpc_cmp (got, expected) != 0) 368 { 369 printf ("Error: mpc_set_str o mpc_get_str != Id\n" 370 "in base %u with str=\"%s\"\n", base, str); 371 MPC_OUT (expected); 372 printf (" "); 373 MPC_OUT (got); 374 exit (1); 375 } 376 mpc_free_str (str); 377 } 378 379#ifdef HAVE_SETLOCALE 380 { 381 /* Check with ',' as a decimal point */ 382 char *old_locale; 383 384 old_locale = setlocale (LC_ALL, "de_DE"); 385 if (old_locale != NULL) 386 { 387 str = mpc_get_str (10, 0, expected, MPC_RNDNN); 388 if (mpc_set_str (got, str, 10, MPC_RNDNN) == -1 389 || mpc_cmp (got, expected) != 0) 390 { 391 printf ("Error: mpc_set_str o mpc_get_str != Id\n" 392 "with str=\"%s\"\n", str); 393 MPC_OUT (expected); 394 printf (" "); 395 MPC_OUT (got); 396 exit (1); 397 } 398 mpc_free_str (str); 399 400 setlocale (LC_ALL, old_locale); 401 } 402 } 403#endif /* HAVE_SETLOCALE */ 404 405 /* the real part has a zero exponent in base ten (fixed in r439) */ 406 mpc_set_prec (expected, 37); 407 mpc_set_prec (got, 37); 408 mpc_set_str (expected, "921FC04EDp-35 ", 16, MPFR_RNDN); 409 str = mpc_get_str (10, 0, expected, MPC_RNDNN); 410 if (mpc_set_str (got, str, 10, MPC_RNDNN) == -1 411 || mpc_cmp (got, expected) != 0) 412 { 413 printf ("Error: mpc_set_str o mpc_get_str != Id\n" 414 "with str=\"%s\"\n", str); 415 MPC_OUT (expected); 416 printf (" "); 417 MPC_OUT (got); 418 exit (1); 419 } 420 mpc_free_str (str); 421 422 str = mpc_get_str (1, 0, expected, MPC_RNDNN); 423 if (str != NULL) 424 { 425 printf ("Error: mpc_get_str with base==1 should fail\n"); 426 exit (1); 427 } 428 429 mpc_clear (expected); 430 mpc_clear (got); 431} 432 433int 434main (void) 435{ 436 test_start (); 437 438 check_set (); 439 check_set_str (1024); 440 441 test_end (); 442 443 return 0; 444} 445