1/* Test file for mpfr_sinh_cosh. 2 3Copyright 2007-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 25static void 26failed (mpfr_ptr x, mpfr_ptr esh, mpfr_ptr gsh, mpfr_ptr ech, mpfr_ptr gch) 27{ 28 printf ("error : mpfr_sinh_cosh (x) x = "); 29 mpfr_out_str (stdout, 10, 0, x, MPFR_RNDD); 30 printf ("\nsinh(x) expected "); 31 mpfr_out_str (stdout, 10, 0, esh, MPFR_RNDD); 32 printf ("\n got "); 33 mpfr_out_str (stdout, 10, 0, gsh, MPFR_RNDD); 34 printf ("\ncosh(x) expected "); 35 mpfr_out_str (stdout, 10, 0, ech, MPFR_RNDD); 36 printf ("\n got "); 37 mpfr_out_str (stdout, 10, 0, gch, MPFR_RNDD); 38 putchar ('\n'); 39 40 mpfr_clears (x, esh, gsh, ech, gch, (mpfr_ptr) 0); 41 exit (1); 42} 43 44/* check against sinh, cosh */ 45static void 46check (mpfr_ptr x, mpfr_rnd_t rnd) 47{ 48 mpfr_t s, c, sx, cx; 49 int isc, is, ic; 50 51 mpfr_inits2 (MPFR_PREC(x), s, c, sx, cx, (mpfr_ptr) 0); 52 53 isc = mpfr_sinh_cosh (sx, cx, x, rnd); 54 is = mpfr_sinh (s, x, rnd); 55 ic = mpfr_cosh (c, x, rnd); 56 57 if (!mpfr_equal_p (s, sx) || !mpfr_equal_p (c, cx)) 58 failed (x, s, sx, c, cx); 59 MPFR_ASSERTN (isc = is || ic); 60 61 mpfr_clears (s, c, sx, cx, (mpfr_ptr) 0); 62} 63 64static void 65check_nans (void) 66{ 67 mpfr_t x, sh, ch; 68 69 mpfr_init2 (x, 123); 70 mpfr_init2 (sh, 123); 71 mpfr_init2 (ch, 123); 72 73 /* nan */ 74 mpfr_set_nan (x); 75 mpfr_sinh_cosh (sh, ch, x, MPFR_RNDN); 76 MPFR_ASSERTN (mpfr_nan_p (sh)); 77 MPFR_ASSERTN (mpfr_nan_p (ch)); 78 79 /* +inf */ 80 mpfr_set_inf (x, 1); 81 mpfr_sinh_cosh (sh, ch, x, MPFR_RNDN); 82 MPFR_ASSERTN (mpfr_inf_p (sh)); 83 MPFR_ASSERTN (mpfr_sgn (sh) > 0); 84 MPFR_ASSERTN (mpfr_inf_p (ch)); 85 MPFR_ASSERTN (mpfr_sgn (ch) > 0); 86 87 /* -inf */ 88 mpfr_set_inf (x, -1); 89 mpfr_sinh_cosh (sh, ch, x, MPFR_RNDN); 90 MPFR_ASSERTN (mpfr_inf_p (sh)); 91 MPFR_ASSERTN (mpfr_sgn (sh) < 0); 92 MPFR_ASSERTN (mpfr_inf_p (ch)); 93 MPFR_ASSERTN (mpfr_sgn (ch) > 0); 94 95 mpfr_clear (x); 96 mpfr_clear (sh); 97 mpfr_clear (ch); 98} 99 100int 101main (int argc, char *argv[]) 102{ 103 int i; 104 mpfr_t x; 105 106 tests_start_mpfr (); 107 108 check_nans (); 109 110 /* check against values given by sinh(x), cosh(x) */ 111 mpfr_init2 (x, 53); 112 mpfr_set_str (x, "FEDCBA987654321p-48", 16, MPFR_RNDN); 113 for (i = 0; i < 10; ++i) 114 { 115 /* x = i - x / 2 : boggle sign and bits */ 116 mpfr_ui_sub (x, i, x, MPFR_RNDD); 117 mpfr_div_2ui (x, x, 2, MPFR_RNDD); 118 119 check (x, MPFR_RNDN); 120 check (x, MPFR_RNDU); 121 check (x, MPFR_RNDD); 122 } 123 mpfr_clear (x); 124 125 tests_end_mpfr (); 126 return 0; 127} 128