1 1.1 mrg /* Test file for mpfr_cosh. 2 1.1 mrg 3 1.1.1.6 mrg Copyright 2001-2002, 2004-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 #define TEST_FUNCTION mpfr_cosh 26 1.1 mrg #define TEST_RANDOM_EMIN -36 27 1.1 mrg #define TEST_RANDOM_EMAX 36 28 1.1 mrg #include "tgeneric.c" 29 1.1 mrg 30 1.1 mrg static void 31 1.1 mrg special (void) 32 1.1 mrg { 33 1.1 mrg mpfr_t x, y; 34 1.1 mrg int i; 35 1.1 mrg 36 1.1 mrg mpfr_init (x); 37 1.1 mrg mpfr_init (y); 38 1.1 mrg 39 1.1 mrg mpfr_set_nan (x); 40 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 41 1.1 mrg if (!mpfr_nan_p (y)) 42 1.1 mrg { 43 1.1 mrg printf ("Error: cosh(NaN) != NaN\n"); 44 1.1 mrg exit (1); 45 1.1 mrg } 46 1.1 mrg 47 1.1 mrg mpfr_set_inf (x, 1); 48 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 49 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0) 50 1.1 mrg { 51 1.1 mrg printf ("Error: cosh(+Inf) != +Inf\n"); 52 1.1 mrg exit (1); 53 1.1 mrg } 54 1.1 mrg 55 1.1 mrg mpfr_set_inf (x, -1); 56 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 57 1.1 mrg if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0) 58 1.1 mrg { 59 1.1 mrg printf ("Error: cosh(-Inf) != +Inf\n"); 60 1.1 mrg exit (1); 61 1.1 mrg } 62 1.1 mrg 63 1.1 mrg /* cosh(+/-0) = 1 */ 64 1.1 mrg mpfr_set_ui (x, 0, MPFR_RNDN); 65 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 66 1.1 mrg if (mpfr_cmp_ui (y, 1)) 67 1.1 mrg { 68 1.1 mrg printf ("Error: cosh(+0) != 1\n"); 69 1.1 mrg exit (1); 70 1.1 mrg } 71 1.1 mrg mpfr_neg (x, x, MPFR_RNDN); 72 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 73 1.1 mrg if (mpfr_cmp_ui (y, 1)) 74 1.1 mrg { 75 1.1 mrg printf ("Error: cosh(-0) != 1\n"); 76 1.1 mrg exit (1); 77 1.1 mrg } 78 1.1 mrg 79 1.1 mrg mpfr_set_prec (x, 32); 80 1.1 mrg mpfr_set_prec (y, 32); 81 1.1 mrg 82 1.1 mrg mpfr_set_str_binary (x, "0.1101110111111111001011101000101"); 83 1.1 mrg mpfr_set_str_binary (y, "1.0110011001110000101100011001001"); 84 1.1 mrg mpfr_cosh (x, x, MPFR_RNDN); 85 1.1 mrg if (mpfr_cmp (x, y)) 86 1.1 mrg { 87 1.1 mrg printf ("Error: mpfr_cosh for prec=32 (1)\n"); 88 1.1 mrg exit (1); 89 1.1 mrg } 90 1.1 mrg 91 1.1 mrg mpfr_set_str_binary (x, "-0.1110111000011101010111100000101E-1"); 92 1.1 mrg mpfr_set_str_binary (y, "1.0001110000101111111111100110101"); 93 1.1 mrg mpfr_cosh (x, x, MPFR_RNDN); 94 1.1 mrg if (mpfr_cmp (x, y)) 95 1.1 mrg { 96 1.1 mrg printf ("Error: mpfr_cosh for prec=32 (2)\n"); 97 1.1 mrg exit (1); 98 1.1 mrg } 99 1.1 mrg 100 1.1 mrg mpfr_set_prec (x, 2); 101 1.1 mrg mpfr_clear_flags (); 102 1.1 mrg mpfr_set_str_binary (x, "1E1000000000"); 103 1.1 mrg i = mpfr_cosh (x, x, MPFR_RNDN); 104 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_IS_POS (x)); 105 1.1 mrg MPFR_ASSERTN (mpfr_overflow_p ()); 106 1.1 mrg MPFR_ASSERTN (i == 1); 107 1.1 mrg 108 1.1 mrg mpfr_clear_flags (); 109 1.1 mrg mpfr_set_str_binary (x, "-1E1000000000"); 110 1.1 mrg i = mpfr_cosh (x, x, MPFR_RNDN); 111 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_IS_POS (x)); 112 1.1 mrg MPFR_ASSERTN (mpfr_overflow_p () && !mpfr_underflow_p ()); 113 1.1 mrg MPFR_ASSERTN (i == 1); 114 1.1 mrg 115 1.1 mrg mpfr_clear_flags (); 116 1.1 mrg mpfr_set_str_binary (x, "-1E1000000000"); 117 1.1 mrg i = mpfr_cosh (x, x, MPFR_RNDD); 118 1.1.1.4 mrg MPFR_ASSERTN (!MPFR_IS_INF (x) && MPFR_IS_POS (x)); 119 1.1 mrg MPFR_ASSERTN (mpfr_overflow_p () && !mpfr_underflow_p ()); 120 1.1 mrg MPFR_ASSERTN (i == -1); 121 1.1 mrg 122 1.1 mrg mpfr_clear_flags (); 123 1.1 mrg mpfr_set_str_binary (x, "-1E1000000000"); 124 1.1 mrg i = mpfr_cosh (x, x, MPFR_RNDU); 125 1.1.1.4 mrg MPFR_ASSERTN (MPFR_IS_INF (x) && MPFR_IS_POS (x)); 126 1.1 mrg MPFR_ASSERTN (mpfr_overflow_p () && !mpfr_underflow_p ()); 127 1.1 mrg MPFR_ASSERTN (i == 1); 128 1.1 mrg 129 1.1 mrg mpfr_clear (x); 130 1.1 mrg mpfr_clear (y); 131 1.1 mrg } 132 1.1 mrg 133 1.1 mrg static void 134 1.1 mrg special_overflow (void) 135 1.1 mrg { 136 1.1 mrg /* Check for overflow in 3 cases: 137 1.1 mrg 1. cosh(x) is representable, but not exp(x) 138 1.1 mrg 2. cosh(x) is not representable in the selected range of exp. 139 1.1 mrg 3. cosh(x) exp overflow even with the largest range of exp */ 140 1.1 mrg mpfr_t x, y; 141 1.1 mrg mpfr_exp_t emin, emax; 142 1.1 mrg 143 1.1 mrg emin = mpfr_get_emin (); 144 1.1 mrg emax = mpfr_get_emax (); 145 1.1 mrg 146 1.1 mrg set_emin (-125); 147 1.1 mrg set_emax (128); 148 1.1 mrg 149 1.1 mrg mpfr_init2 (x, 24); 150 1.1 mrg mpfr_init2 (y, 24); 151 1.1 mrg 152 1.1 mrg mpfr_set_str_binary (x, "0.101100100000000000110100E7"); 153 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 154 1.1 mrg if (mpfr_cmp_str (y, "0.101010001111001010001110E128", 2, MPFR_RNDN)) 155 1.1 mrg { 156 1.1 mrg printf("Special overflow error 1.\n"); 157 1.1 mrg mpfr_dump (y); 158 1.1 mrg exit (1); 159 1.1 mrg } 160 1.1 mrg 161 1.1 mrg mpfr_set_str_binary (x, "0.101100100000000000110100E8"); 162 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 163 1.1 mrg if (!mpfr_inf_p(y)) 164 1.1 mrg { 165 1.1 mrg printf("Special overflow error 2.\n"); 166 1.1 mrg mpfr_dump (y); 167 1.1 mrg exit (1); 168 1.1 mrg } 169 1.1 mrg 170 1.1 mrg set_emin (emin); 171 1.1 mrg set_emax (emax); 172 1.1 mrg 173 1.1 mrg mpfr_set_str_binary (x, "0.101100100000000000110100E1000000"); 174 1.1 mrg mpfr_cosh (y, x, MPFR_RNDN); 175 1.1 mrg if (!mpfr_inf_p(y)) 176 1.1 mrg { 177 1.1 mrg printf("Special overflow error 3.\n"); 178 1.1 mrg mpfr_dump (y); 179 1.1 mrg exit (1); 180 1.1 mrg } 181 1.1 mrg 182 1.1 mrg mpfr_clear (y); 183 1.1 mrg mpfr_clear (x); 184 1.1 mrg } 185 1.1 mrg 186 1.1 mrg int 187 1.1 mrg main (int argc, char *argv[]) 188 1.1 mrg { 189 1.1 mrg tests_start_mpfr (); 190 1.1 mrg 191 1.1 mrg special_overflow (); 192 1.1 mrg special (); 193 1.1 mrg 194 1.1.1.4 mrg test_generic (MPFR_PREC_MIN, 100, 100); 195 1.1 mrg 196 1.1 mrg data_check ("data/cosh", mpfr_cosh, "mpfr_cosh"); 197 1.1 mrg bad_cases (mpfr_cosh, mpfr_acosh, "mpfr_cosh", 0, 1, 255, 4, 128, 800, 100); 198 1.1 mrg 199 1.1 mrg tests_end_mpfr (); 200 1.1 mrg return 0; 201 1.1 mrg } 202