1251881Speter/* Test file for mpfr_coth. 2251881Speter 3251881SpeterCopyright 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. 4251881SpeterContributed by the Arenaire and Cacao projects, INRIA. 5251881Speter 6251881SpeterThis file is part of the GNU MPFR Library. 7251881Speter 8251881SpeterThe GNU MPFR Library is free software; you can redistribute it and/or modify 9251881Speterit under the terms of the GNU Lesser General Public License as published by 10251881Speterthe Free Software Foundation; either version 3 of the License, or (at your 11251881Speteroption) any later version. 12251881Speter 13251881SpeterThe GNU MPFR Library is distributed in the hope that it will be useful, but 14251881SpeterWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15251881Speteror FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16251881SpeterLicense for more details. 17251881Speter 18251881SpeterYou should have received a copy of the GNU Lesser General Public License 19251881Speteralong with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20251881Speterhttp://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 21251881Speter51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 22251881Speter 23251881Speter#include <stdio.h> 24251881Speter#include <stdlib.h> 25251881Speter 26251881Speter#include "mpfr-test.h" 27251881Speter 28251881Speter#define TEST_FUNCTION mpfr_coth 29251881Speter#include "tgeneric.c" 30251881Speter 31251881Speterstatic void 32251881Spetercheck_specials (void) 33251881Speter{ 34251881Speter mpfr_t x, y; 35251881Speter 36251881Speter mpfr_init2 (x, 123L); 37251881Speter mpfr_init2 (y, 123L); 38251881Speter 39251881Speter mpfr_set_nan (x); 40251881Speter mpfr_coth (y, x, MPFR_RNDN); 41251881Speter if (! mpfr_nan_p (y)) 42251881Speter { 43251881Speter printf ("Error: coth(NaN) != NaN\n"); 44251881Speter exit (1); 45251881Speter } 46251881Speter 47251881Speter mpfr_set_inf (x, 1); 48251881Speter mpfr_coth (y, x, MPFR_RNDN); 49251881Speter if (mpfr_cmp_ui (y, 1)) 50251881Speter { 51251881Speter printf ("Error: coth(Inf) != 1\n"); 52251881Speter exit (1); 53251881Speter } 54251881Speter 55251881Speter mpfr_set_inf (x, -1); 56251881Speter mpfr_coth (y, x, MPFR_RNDN); 57251881Speter if (mpfr_cmp_si (y, -1)) 58251881Speter { 59251881Speter printf ("Error: coth(-Inf) != -1\n"); 60251881Speter exit (1); 61251881Speter } 62251881Speter 63251881Speter /* coth(+/-0) = +/-Inf */ 64251881Speter mpfr_set_ui (x, 0, MPFR_RNDN); 65251881Speter mpfr_coth (y, x, MPFR_RNDN); 66251881Speter if (! (mpfr_inf_p (y) && MPFR_SIGN (y) > 0)) 67251881Speter { 68251881Speter printf ("Error: coth(+0) != +Inf\n"); 69251881Speter exit (1); 70251881Speter } 71251881Speter mpfr_neg (x, x, MPFR_RNDN); 72251881Speter mpfr_coth (y, x, MPFR_RNDN); 73251881Speter if (! (mpfr_inf_p (y) && MPFR_SIGN (y) < 0)) 74251881Speter { 75251881Speter printf ("Error: coth(-0) != -Inf\n"); 76251881Speter exit (1); 77251881Speter } 78251881Speter 79251881Speter mpfr_clear (x); 80251881Speter mpfr_clear (y); 81251881Speter} 82251881Speter 83251881Speterstatic void 84251881Spetercheck_bugs (void) 85251881Speter{ 86251881Speter mpfr_t x, y; 87251881Speter 88251881Speter mpfr_init (x); 89251881Speter mpfr_init (y); 90251881Speter 91251881Speter /* bug found by Rob (Sisyphus) on 16 Sep 2005 */ 92251881Speter mpfr_set_ui (x, 2, MPFR_RNDN); 93251881Speter mpfr_set_prec (y, 2); 94251881Speter mpfr_coth (y, x, MPFR_RNDN); 95251881Speter if (mpfr_cmp_ui (y, 1)) 96251881Speter { 97251881Speter printf ("Error for coth(2), expected 1, got "); 98251881Speter mpfr_dump (y); 99251881Speter exit (1); 100251881Speter } 101251881Speter 102251881Speter mpfr_set_prec (x, 53); 103251881Speter mpfr_set_prec (y, 53); 104251881Speter 105251881Speter mpfr_set_str (x, "18.368400284838550", 10, MPFR_RNDN); 106251881Speter mpfr_set_str (y, "1.0000000000000002", 10, MPFR_RNDN); 107251881Speter mpfr_coth (x, x, MPFR_RNDN); 108251881Speter if (mpfr_cmp (x, y) != 0) 109251881Speter { 110251881Speter printf ("Error for coth(18.368400284838550)\n"); 111251881Speter exit (1); 112251881Speter } 113251881Speter 114251881Speter mpfr_set_str (x, "18.714973875118520", 10, MPFR_RNDN); 115251881Speter mpfr_coth (x, x, MPFR_RNDN); 116251881Speter if (mpfr_cmp (x, y) != 0) 117251881Speter { 118251881Speter printf ("Error for coth(18.714973875118520)\n"); 119251881Speter exit (1); 120251881Speter } 121251881Speter 122251881Speter mpfr_set_str (x, "18.714973875118524", 10, MPFR_RNDN); 123251881Speter mpfr_coth (x, x, MPFR_RNDN); 124251881Speter if (mpfr_cmp_ui (x, 1) != 0) 125251881Speter { 126251881Speter printf ("Error for coth(18.714973875118524)\n"); 127251881Speter exit (1); 128251881Speter } 129251881Speter 130251881Speter mpfr_clear (x); 131251881Speter mpfr_clear (y); 132251881Speter} 133251881Speter 134251881Speterstatic void 135251881Speterunderflowed_cothinf (void) 136251881Speter{ 137251881Speter mpfr_t x, y; 138251881Speter int i, inex, rnd, err = 0; 139251881Speter mpfr_exp_t old_emin; 140251881Speter 141251881Speter old_emin = mpfr_get_emin (); 142251881Speter 143251881Speter mpfr_init2 (x, 8); 144251881Speter mpfr_init2 (y, 8); 145251881Speter 146251881Speter for (i = -1; i <= 1; i += 2) 147251881Speter RND_LOOP (rnd) 148251881Speter { 149251881Speter mpfr_set_inf (x, i); 150251881Speter mpfr_clear_flags (); 151251881Speter set_emin (2); /* 1 is not representable. */ 152251881Speter inex = mpfr_coth (x, x, (mpfr_rnd_t) rnd); 153251881Speter set_emin (old_emin); 154251881Speter if (! mpfr_underflow_p ()) 155251881Speter { 156251881Speter printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 157251881Speter " The underflow flag is not set.\n", 158251881Speter i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 159251881Speter err = 1; 160251881Speter } 161251881Speter mpfr_set_si (y, (i < 0 && (rnd == MPFR_RNDD || rnd == MPFR_RNDA)) || 162251881Speter (i > 0 && (rnd == MPFR_RNDU || rnd == MPFR_RNDA)) 163251881Speter ? 2 : 0, MPFR_RNDN); 164251881Speter if (i < 0) 165251881Speter mpfr_neg (y, y, MPFR_RNDN); 166251881Speter if (! (mpfr_equal_p (x, y) && 167251881Speter MPFR_MULT_SIGN (MPFR_SIGN (x), MPFR_SIGN (y)) > 0)) 168251881Speter { 169251881Speter printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 170251881Speter " Got ", i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 171251881Speter mpfr_print_binary (x); 172251881Speter printf (" instead of "); 173251881Speter mpfr_print_binary (y); 174251881Speter printf (".\n"); 175251881Speter err = 1; 176251881Speter } 177251881Speter if ((rnd == MPFR_RNDD || 178251881Speter (i > 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex >= 0) 179251881Speter { 180251881Speter printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 181251881Speter " The inexact value must be negative.\n", 182251881Speter i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 183251881Speter err = 1; 184251881Speter } 185251881Speter if ((rnd == MPFR_RNDU || 186251881Speter (i < 0 && (rnd == MPFR_RNDN || rnd == MPFR_RNDZ))) && inex <= 0) 187251881Speter { 188251881Speter printf ("Error in underflowed_cothinf (i = %d, rnd = %s):\n" 189251881Speter " The inexact value must be positive.\n", 190251881Speter i, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); 191251881Speter err = 1; 192251881Speter } 193251881Speter } 194251881Speter 195251881Speter if (err) 196251881Speter exit (1); 197251881Speter mpfr_clear (x); 198251881Speter mpfr_clear (y); 199251881Speter} 200251881Speter 201251881Speterint 202251881Spetermain (int argc, char *argv[]) 203251881Speter{ 204251881Speter tests_start_mpfr (); 205251881Speter 206251881Speter check_specials (); 207251881Speter check_bugs (); 208251881Speter test_generic (2, 200, 10); 209251881Speter underflowed_cothinf (); 210251881Speter 211251881Speter tests_end_mpfr (); 212251881Speter return 0; 213251881Speter} 214251881Speter