1/* Test file for mpfr_add_ui 2 3Copyright 2000-2023 Free Software Foundation, Inc. 4Contributed by the AriC and Caramba projects, INRIA. 5 6This file is part of the GNU MPFR Library. 7 8The GNU MPFR Library is free software; you can redistribute it and/or modify 9it under the terms of the GNU Lesser General Public License as published by 10the Free Software Foundation; either version 3 of the License, or (at your 11option) any later version. 12 13The GNU MPFR Library is distributed in the hope that it will be useful, but 14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16License for more details. 17 18You should have received a copy of the GNU Lesser General Public License 19along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2151 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22 23#include <float.h> 24 25#include "mpfr-test.h" 26 27/* checks that x+y gives the right results with 53 bits of precision */ 28static void 29check3 (const char *xs, unsigned long y, mpfr_rnd_t rnd_mode, const char *zs) 30{ 31 mpfr_t xx, zz; 32 33 mpfr_inits2 (53, xx, zz, (mpfr_ptr) 0); 34 mpfr_set_str1 (xx, xs); 35 mpfr_add_ui (zz, xx, y, rnd_mode); 36 if (mpfr_cmp_str1(zz, zs) ) 37 { 38 printf ("expected sum is %s, got ",zs); 39 mpfr_out_str(stdout, 10, 0, zz, MPFR_RNDN); 40 printf ("\nmpfr_add_ui failed for x=%s y=%lu with rnd_mode=%s\n", 41 xs, y, mpfr_print_rnd_mode(rnd_mode)); 42 exit (1); 43 } 44 mpfr_clears (xx, zz, (mpfr_ptr) 0); 45} 46 47static void 48special (void) 49{ 50 mpfr_t x, y; 51 52 mpfr_init2 (x, 63); 53 mpfr_init2 (y, 63); 54 mpfr_set_str_binary (x, "0.110100000000000001110001110010111111000000000101100011100100011"); 55 mpfr_add_ui (y, x, 1, MPFR_RNDD); 56 mpfr_clear (x); 57 mpfr_clear (y); 58} 59 60static void 61check_nans (void) 62{ 63 mpfr_t x, y; 64 65 mpfr_init2 (x, 123L); 66 mpfr_init2 (y, 123L); 67 68 /* nan + 2394875 == nan */ 69 mpfr_set_nan (x); 70 mpfr_clear_nanflag (); 71 mpfr_add_ui (y, x, 2394875L, MPFR_RNDN); 72 MPFR_ASSERTN (mpfr_nanflag_p ()); 73 MPFR_ASSERTN (mpfr_nan_p (y)); 74 75 /* +inf + 2394875 == +inf */ 76 mpfr_set_inf (x, 1); 77 mpfr_add_ui (y, x, 2394875L, MPFR_RNDN); 78 MPFR_ASSERTN (mpfr_inf_p (y)); 79 MPFR_ASSERTN (mpfr_sgn (y) > 0); 80 81 /* -inf + 2394875 == -inf */ 82 mpfr_set_inf (x, -1); 83 mpfr_add_ui (y, x, 2394875L, MPFR_RNDN); 84 MPFR_ASSERTN (mpfr_inf_p (y)); 85 MPFR_ASSERTN (mpfr_sgn (y) < 0); 86 87 mpfr_clear (x); 88 mpfr_clear (y); 89} 90 91#define TEST_FUNCTION mpfr_add_ui 92#define ULONG_ARG2 93#define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), 1, RANDS) 94#include "tgeneric.c" 95 96int 97main (int argc, char *argv[]) 98{ 99 tests_start_mpfr (); 100 101 check_nans (); 102 103 special (); 104 check3 ("-1.716113812768534e-140", 1271212614, MPFR_RNDZ, 105 "1.27121261399999976e9"); 106 check3 ("1.22191250737771397120e+20", 948002822, MPFR_RNDN, 107 "122191250738719408128.0"); 108 check3 ("-6.72658901114033715233e-165", 2000878121, MPFR_RNDZ, 109 "2.0008781209999997615e9"); 110 check3 ("-2.0769715792901673e-5", 880524, MPFR_RNDN, 111 "8.8052399997923023e5"); 112 113 test_generic (MPFR_PREC_MIN, 1000, 100); 114 115 tests_end_mpfr (); 116 return 0; 117} 118