1/* Test file for mpfr_add_ui 2 3Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4Contributed by the Arenaire and Cacao 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 20http://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 <stdio.h> 24#include <stdlib.h> 25#include <float.h> 26 27#include "mpfr-test.h" 28 29/* checks that x+y gives the right results with 53 bits of precision */ 30static void 31check3 (const char *xs, unsigned long y, mpfr_rnd_t rnd_mode, const char *zs) 32{ 33 mpfr_t xx, zz; 34 35 mpfr_inits2 (53, xx, zz, (mpfr_ptr) 0); 36 mpfr_set_str1 (xx, xs); 37 mpfr_add_ui (zz, xx, y, rnd_mode); 38 if (mpfr_cmp_str1(zz, zs) ) 39 { 40 printf ("expected sum is %s, got ",zs); 41 mpfr_out_str(stdout, 10, 0, zz, MPFR_RNDN); 42 printf ("\nmpfr_add_ui failed for x=%s y=%lu with rnd_mode=%s\n", 43 xs, y, mpfr_print_rnd_mode(rnd_mode)); 44 exit (1); 45 } 46 mpfr_clears (xx, zz, (mpfr_ptr) 0); 47} 48 49static void 50special (void) 51{ 52 mpfr_t x, y; 53 54 mpfr_init2 (x, 63); 55 mpfr_init2 (y, 63); 56 mpfr_set_str_binary (x, "0.110100000000000001110001110010111111000000000101100011100100011"); 57 mpfr_add_ui (y, x, 1, MPFR_RNDD); 58 mpfr_clear (x); 59 mpfr_clear (y); 60} 61 62static void 63check_nans (void) 64{ 65 mpfr_t x, y; 66 67 mpfr_init2 (x, 123L); 68 mpfr_init2 (y, 123L); 69 70 /* nan + 2394875 == nan */ 71 mpfr_set_nan (x); 72 mpfr_add_ui (y, x, 2394875L, MPFR_RNDN); 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 INTEGER_TYPE unsigned long 93#define RAND_FUNCTION(x) mpfr_random2(x, MPFR_LIMB_SIZE (x), 1, RANDS) 94#include "tgeneric_ui.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 test_generic_ui (2, 1000, 100); 113 114 tests_end_mpfr (); 115 return 0; 116} 117