1/* Test file for mpfr_coth. 2 3Copyright 2005-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 "mpfr-test.h" 24 25#define TEST_FUNCTION mpfr_coth 26#include "tgeneric.c" 27 28static void 29check_specials (void) 30{ 31 mpfr_t x, y; 32 33 mpfr_init2 (x, 123L); 34 mpfr_init2 (y, 123L); 35 36 mpfr_set_nan (x); 37 mpfr_coth (y, x, MPFR_RNDN); 38 if (! mpfr_nan_p (y)) 39 { 40 printf ("Error: coth(NaN) != NaN\n"); 41 exit (1); 42 } 43 44 mpfr_set_inf (x, 1); 45 mpfr_coth (y, x, MPFR_RNDN); 46 if (mpfr_cmp_ui (y, 1)) 47 { 48 printf ("Error: coth(Inf) != 1\n"); 49 exit (1); 50 } 51 52 mpfr_set_inf (x, -1); 53 mpfr_coth (y, x, MPFR_RNDN); 54 if (mpfr_cmp_si (y, -1)) 55 { 56 printf ("Error: coth(-Inf) != -1\n"); 57 exit (1); 58 } 59 60 /* coth(+/-0) = +/-Inf */ 61 mpfr_set_ui (x, 0, MPFR_RNDN); 62 mpfr_coth (y, x, MPFR_RNDN); 63 if (! (mpfr_inf_p (y) && MPFR_IS_POS (y))) 64 { 65 printf ("Error: coth(+0) != +Inf\n"); 66 exit (1); 67 } 68 mpfr_neg (x, x, MPFR_RNDN); 69 mpfr_coth (y, x, MPFR_RNDN); 70 if (! (mpfr_inf_p (y) && MPFR_IS_NEG (y))) 71 { 72 printf ("Error: coth(-0) != -Inf\n"); 73 exit (1); 74 } 75 76 mpfr_clear (x); 77 mpfr_clear (y); 78} 79 80static void 81check_bugs (void) 82{ 83 mpfr_t x, y; 84 85 mpfr_init (x); 86 mpfr_init (y); 87 88 /* bug found by Rob (Sisyphus) on 16 Sep 2005 */ 89 mpfr_set_ui (x, 2, MPFR_RNDN); 90 mpfr_set_prec (y, 2); 91 mpfr_coth (y, x, MPFR_RNDN); 92 if (mpfr_cmp_ui (y, 1)) 93 { 94 printf ("Error for coth(2), expected 1, got "); 95 mpfr_dump (y); 96 exit (1); 97 } 98 99 mpfr_set_prec (x, 53); 100 mpfr_set_prec (y, 53); 101 102 mpfr_set_str (x, "18.368400284838550", 10, MPFR_RNDN); 103 mpfr_set_str (y, "1.0000000000000002", 10, MPFR_RNDN); 104 mpfr_coth (x, x, MPFR_RNDN); 105 if (mpfr_cmp (x, y) != 0) 106 { 107 printf ("Error for coth(18.368400284838550)\n"); 108 exit (1); 109 } 110 111 mpfr_set_str (x, "18.714973875118520", 10, MPFR_RNDN); 112 mpfr_coth (x, x, MPFR_RNDN); 113 if (mpfr_cmp (x, y) != 0) 114 { 115 printf ("Error for coth(18.714973875118520)\n"); 116 exit (1); 117 } 118 119 mpfr_set_str (x, "18.714973875118524", 10, MPFR_RNDN); 120 mpfr_coth (x, x, MPFR_RNDN); 121 if (mpfr_cmp_ui (x, 1) != 0) 122 { 123 printf ("Error for coth(18.714973875118524)\n"); 124 exit (1); 125 } 126 127 mpfr_clear (x); 128 mpfr_clear (y); 129} 130 131static void 132underflowed_cothinf (void) 133{ 134 mpfr_t x, y; 135 int i, inex, rnd, err = 0; 136 mpfr_exp_t old_emin; 137 138 old_emin = mpfr_get_emin (); 139 140 mpfr_init2 (x, 8); 141 mpfr_init2 (y, 8); 142 143 for (i = -1; i <= 1; i += 2) 144 RND_LOOP_NO_RNDF (rnd) 145 { 146 mpfr_set_inf (x, i); 147 mpfr_clear_flags (); 148 set_emin (2); /* 1 is not representable. */ 149 inex = mpfr_coth (x, x, (mpfr_rnd_t) rnd); 150 set_emin (old_emin); 151 if (! mpfr_underflow_p ()) 152 { 153 printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 154 " The underflow flag is not set.\n", 155 i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 156 err = 1; 157 } 158 mpfr_set_si (y, (i < 0 && (rnd == MPFR_RNDD || rnd == MPFR_RNDA)) || 159 (i > 0 && (rnd == MPFR_RNDU || rnd == MPFR_RNDA)) 160 ? 2 : 0, MPFR_RNDN); 161 if (i < 0) 162 mpfr_neg (y, y, MPFR_RNDN); 163 if (! (mpfr_equal_p (x, y) && 164 MPFR_MULT_SIGN (MPFR_SIGN (x), MPFR_SIGN (y)) > 0)) 165 { 166 printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 167 " Got ", i, 168 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 169 mpfr_dump (x); 170 printf (" instead of "); 171 mpfr_dump (y); 172 err = 1; 173 } 174 if ((rnd == MPFR_RNDD || 175 (i > 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex >= 0) 176 { 177 printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 178 " The inexact value must be negative.\n", 179 i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 180 err = 1; 181 } 182 if ((rnd == MPFR_RNDU || 183 (i < 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex <= 0) 184 { 185 printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 186 " The inexact value must be positive.\n", 187 i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 188 err = 1; 189 } 190 } 191 192 if (err) 193 exit (1); 194 mpfr_clear (x); 195 mpfr_clear (y); 196} 197 198int 199main (int argc, char *argv[]) 200{ 201 tests_start_mpfr (); 202 203 check_specials (); 204 check_bugs (); 205 test_generic (MPFR_PREC_MIN, 200, 10); 206 underflowed_cothinf (); 207 208 tests_end_mpfr (); 209 return 0; 210} 211