1 1.1 mrg /* Test file for mpfr_set_z. 2 1.1 mrg 3 1.1.1.6 mrg Copyright 1999, 2001-2023 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.1.5 mrg https://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 "mpfr-test.h" 24 1.1 mrg 25 1.1 mrg static void check0(void) 26 1.1 mrg { 27 1.1 mrg mpz_t y; 28 1.1 mrg mpfr_t x; 29 1.1 mrg int inexact, r; 30 1.1 mrg 31 1.1 mrg /* Check for +0 */ 32 1.1 mrg mpfr_init (x); 33 1.1 mrg mpz_init (y); 34 1.1 mrg mpz_set_si (y, 0); 35 1.1.1.6 mrg RND_LOOP (r) 36 1.1 mrg { 37 1.1 mrg inexact = mpfr_set_z (x, y, (mpfr_rnd_t) r); 38 1.1 mrg if (!MPFR_IS_ZERO(x) || !MPFR_IS_POS(x) || inexact) 39 1.1 mrg { 40 1.1 mrg printf("mpfr_set_z(x,0) failed for %s\n", 41 1.1 mrg mpfr_print_rnd_mode ((mpfr_rnd_t) r)); 42 1.1 mrg exit(1); 43 1.1 mrg } 44 1.1 mrg } 45 1.1 mrg mpfr_clear(x); 46 1.1 mrg mpz_clear(y); 47 1.1 mrg } 48 1.1 mrg 49 1.1 mrg /* FIXME: It'd be better to examine the actual data in an mpfr_t to see that 50 1.1 mrg it's as expected. Comparing mpfr_set_z with mpfr_cmp or against 51 1.1 mrg mpfr_get_si is a rather indirect test of a low level routine. */ 52 1.1 mrg 53 1.1 mrg static void 54 1.1 mrg check (long i, mpfr_rnd_t rnd) 55 1.1 mrg { 56 1.1 mrg mpfr_t f; 57 1.1 mrg mpz_t z; 58 1.1 mrg 59 1.1 mrg mpfr_init2 (f, 8 * sizeof(long)); 60 1.1 mrg mpz_init (z); 61 1.1 mrg mpz_set_ui (z, i); 62 1.1 mrg mpfr_set_z (f, z, rnd); 63 1.1 mrg if (mpfr_get_si (f, MPFR_RNDZ) != i) 64 1.1 mrg { 65 1.1 mrg printf ("Error in mpfr_set_z for i=%ld rnd_mode=%d\n", i, rnd); 66 1.1 mrg exit (1); 67 1.1 mrg } 68 1.1 mrg mpfr_clear (f); 69 1.1 mrg mpz_clear (z); 70 1.1 mrg } 71 1.1 mrg 72 1.1 mrg static void 73 1.1 mrg check_large (void) 74 1.1 mrg { 75 1.1 mrg mpz_t z; 76 1.1 mrg mpfr_t x, y; 77 1.1 mrg mpfr_exp_t emax, emin; 78 1.1 mrg 79 1.1 mrg mpz_init (z); 80 1.1 mrg mpfr_init2 (x, 160); 81 1.1 mrg mpfr_init2 (y, 160); 82 1.1 mrg 83 1.1 mrg mpz_set_str (z, "77031627725494291259359895954016675357279104942148788042", 10); 84 1.1 mrg mpfr_set_z (x, z, MPFR_RNDN); 85 1.1 mrg mpfr_set_str_binary (y, "0.1100100100001111110110101010001000100001011010001100001000110100110001001100011001100010100010111000000011011100000111001101000100101001000000100100111000001001E186"); 86 1.1 mrg if (mpfr_cmp (x, y)) 87 1.1 mrg { 88 1.1 mrg printf ("Error in mpfr_set_z on large input\n"); 89 1.1 mrg exit (1); 90 1.1 mrg } 91 1.1 mrg 92 1.1 mrg /* check overflow */ 93 1.1 mrg emax = mpfr_get_emax (); 94 1.1 mrg set_emax (2); 95 1.1 mrg mpz_set_str (z, "7", 10); 96 1.1 mrg mpfr_set_z (x, z, MPFR_RNDU); 97 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0); 98 1.1 mrg set_emax (3); 99 1.1 mrg mpfr_set_prec (x, 2); 100 1.1 mrg mpz_set_str (z, "7", 10); 101 1.1 mrg mpfr_set_z (x, z, MPFR_RNDU); 102 1.1 mrg MPFR_ASSERTN(mpfr_inf_p (x) && mpfr_sgn (x) > 0); 103 1.1 mrg set_emax (emax); 104 1.1 mrg 105 1.1 mrg /* check underflow */ 106 1.1 mrg emin = mpfr_get_emin (); 107 1.1 mrg set_emin (3); 108 1.1 mrg mpz_set_str (z, "1", 10); 109 1.1 mrg mpfr_set_z (x, z, MPFR_RNDZ); 110 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (x, 0) == 0 && MPFR_IS_POS(x)); 111 1.1 mrg set_emin (2); 112 1.1 mrg mpfr_set_z (x, z, MPFR_RNDN); 113 1.1 mrg MPFR_ASSERTN(mpfr_cmp_ui (x, 0) == 0 && MPFR_IS_POS(x)); 114 1.1 mrg set_emin (emin); 115 1.1 mrg 116 1.1 mrg mpz_clear (z); 117 1.1 mrg 118 1.1 mrg mpfr_clear (x); 119 1.1 mrg mpfr_clear (y); 120 1.1 mrg } 121 1.1 mrg 122 1.1 mrg int 123 1.1 mrg main (int argc, char *argv[]) 124 1.1 mrg { 125 1.1 mrg long j; 126 1.1 mrg 127 1.1 mrg tests_start_mpfr (); 128 1.1 mrg 129 1.1 mrg check_large (); 130 1.1 mrg check (0, MPFR_RNDN); 131 1.1 mrg for (j = 0; j < 200000; j++) 132 1.1 mrg check (randlimb () & LONG_MAX, RND_RAND ()); 133 1.1 mrg check0 (); 134 1.1 mrg 135 1.1 mrg tests_end_mpfr (); 136 1.1 mrg 137 1.1 mrg return 0; 138 1.1 mrg } 139