Home | History | Annotate | Line # | Download | only in tests
tatanh.c revision 1.1
      1  1.1  mrg /* Test file for mpfr_atanh.
      2  1.1  mrg 
      3  1.1  mrg Copyright 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
      4  1.1  mrg Contributed by the Arenaire and Cacao 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  mrg http://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 <stdio.h>
     24  1.1  mrg #include <stdlib.h>
     25  1.1  mrg 
     26  1.1  mrg #include "mpfr-test.h"
     27  1.1  mrg 
     28  1.1  mrg #define TEST_FUNCTION mpfr_atanh
     29  1.1  mrg #define TEST_RANDOM_EMAX 7
     30  1.1  mrg #include "tgeneric.c"
     31  1.1  mrg 
     32  1.1  mrg static void
     33  1.1  mrg special (void)
     34  1.1  mrg {
     35  1.1  mrg   mpfr_t x, y, z;
     36  1.1  mrg   int i;
     37  1.1  mrg 
     38  1.1  mrg   mpfr_init (x);
     39  1.1  mrg   mpfr_init (y);
     40  1.1  mrg 
     41  1.1  mrg   MPFR_SET_INF(x);
     42  1.1  mrg   mpfr_set_ui (y, 0, MPFR_RNDN);
     43  1.1  mrg   mpfr_atanh (x, y, MPFR_RNDN);
     44  1.1  mrg   if (MPFR_IS_INF(x) || MPFR_IS_NAN(x) )
     45  1.1  mrg     {
     46  1.1  mrg       printf ("Inf flag not clears in atanh!\n");
     47  1.1  mrg       exit (1);
     48  1.1  mrg     }
     49  1.1  mrg 
     50  1.1  mrg   MPFR_SET_NAN(x);
     51  1.1  mrg   mpfr_atanh (x, y, MPFR_RNDN);
     52  1.1  mrg   if (MPFR_IS_NAN(x) || MPFR_IS_INF(x))
     53  1.1  mrg     {
     54  1.1  mrg       printf ("NAN flag not clears in atanh!\n");
     55  1.1  mrg       exit (1);
     56  1.1  mrg     }
     57  1.1  mrg 
     58  1.1  mrg   /* atanh(+/-x) = NaN if x > 1 */
     59  1.1  mrg   for (i = 3; i <= 6; i++)
     60  1.1  mrg     {
     61  1.1  mrg       mpfr_set_si (x, i, MPFR_RNDN);
     62  1.1  mrg       mpfr_div_2ui (x, x, 1, MPFR_RNDN);
     63  1.1  mrg       mpfr_atanh (y, x, MPFR_RNDN);
     64  1.1  mrg       if (!mpfr_nan_p (y))
     65  1.1  mrg         {
     66  1.1  mrg           printf ("Error: mpfr_atanh(%d/2) <> NaN\n", i);
     67  1.1  mrg           exit (1);
     68  1.1  mrg         }
     69  1.1  mrg       mpfr_neg (x, x, MPFR_RNDN);
     70  1.1  mrg       mpfr_atanh (y, x, MPFR_RNDN);
     71  1.1  mrg       if (!mpfr_nan_p (y))
     72  1.1  mrg         {
     73  1.1  mrg           printf ("Error: mpfr_atanh(-%d/2) <> NaN\n", i);
     74  1.1  mrg           exit (1);
     75  1.1  mrg         }
     76  1.1  mrg     }
     77  1.1  mrg 
     78  1.1  mrg   /* atanh(+0) = +0, atanh(-0) = -0 */
     79  1.1  mrg   mpfr_set_ui (x, 0, MPFR_RNDN);
     80  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
     81  1.1  mrg   if (mpfr_cmp_ui (y, 0) || mpfr_sgn (y) < 0)
     82  1.1  mrg     {
     83  1.1  mrg       printf ("Error: mpfr_atanh(+0) <> +0\n");
     84  1.1  mrg       exit (1);
     85  1.1  mrg     }
     86  1.1  mrg   mpfr_neg (x, x, MPFR_RNDN);
     87  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
     88  1.1  mrg   if (mpfr_cmp_ui (y, 0) || mpfr_sgn (y) > 0)
     89  1.1  mrg     {
     90  1.1  mrg       printf ("Error: mpfr_atanh(-0) <> -0\n");
     91  1.1  mrg       exit (1);
     92  1.1  mrg     }
     93  1.1  mrg 
     94  1.1  mrg   MPFR_SET_NAN(x);
     95  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
     96  1.1  mrg   if (!mpfr_nan_p (y))
     97  1.1  mrg     {
     98  1.1  mrg       printf ("Error: mpfr_atanh(NaN) <> NaN\n");
     99  1.1  mrg       exit (1);
    100  1.1  mrg     }
    101  1.1  mrg 
    102  1.1  mrg   mpfr_set_inf (x, 1);
    103  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
    104  1.1  mrg   if (!mpfr_nan_p (y))
    105  1.1  mrg     {
    106  1.1  mrg       printf ("Error: mpfr_atanh(+Inf) <> NaN\n");
    107  1.1  mrg       mpfr_print_binary (y); printf ("\n");
    108  1.1  mrg       exit (1);
    109  1.1  mrg     }
    110  1.1  mrg 
    111  1.1  mrg   mpfr_set_inf (x, -1);
    112  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
    113  1.1  mrg   if (!mpfr_nan_p (y))
    114  1.1  mrg     {
    115  1.1  mrg       printf ("Error: mpfr_atanh(-Inf) <> NaN\n");
    116  1.1  mrg       exit (1);
    117  1.1  mrg     }
    118  1.1  mrg 
    119  1.1  mrg   mpfr_set_ui (x, 1, MPFR_RNDN);
    120  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
    121  1.1  mrg   if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
    122  1.1  mrg     {
    123  1.1  mrg       printf ("Error: mpfr_atanh(1) <> +Inf\n");
    124  1.1  mrg       exit (1);
    125  1.1  mrg     }
    126  1.1  mrg 
    127  1.1  mrg   mpfr_set_si (x, -1, MPFR_RNDN);
    128  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDN);
    129  1.1  mrg   if (!mpfr_inf_p (y) || mpfr_sgn (y) > 0)
    130  1.1  mrg     {
    131  1.1  mrg       printf ("Error: mpfr_atanh(-1) <> -Inf\n");
    132  1.1  mrg       exit (1);
    133  1.1  mrg     }
    134  1.1  mrg 
    135  1.1  mrg   mpfr_set_prec (x, 32);
    136  1.1  mrg   mpfr_set_prec (y, 32);
    137  1.1  mrg 
    138  1.1  mrg   mpfr_set_str_binary (x, "0.10001000001001011000100001E-6");
    139  1.1  mrg   mpfr_atanh (x, x, MPFR_RNDN);
    140  1.1  mrg   mpfr_set_str_binary (y, "0.10001000001001100101010110100001E-6");
    141  1.1  mrg   if (mpfr_cmp (x, y))
    142  1.1  mrg     {
    143  1.1  mrg       printf ("Error: mpfr_atanh (1)\n");
    144  1.1  mrg       exit (1);
    145  1.1  mrg     }
    146  1.1  mrg 
    147  1.1  mrg   mpfr_set_str_binary (x, "-0.1101011110111100111010011001011E-1");
    148  1.1  mrg   mpfr_atanh (x, x, MPFR_RNDN);
    149  1.1  mrg   mpfr_set_str_binary (y, "-0.11100110000100001111101100010111E-1");
    150  1.1  mrg   if (mpfr_cmp (x, y))
    151  1.1  mrg     {
    152  1.1  mrg       printf ("Error: mpfr_atanh (2)\n");
    153  1.1  mrg       exit (1);
    154  1.1  mrg     }
    155  1.1  mrg 
    156  1.1  mrg   mpfr_set_prec (x, 33);
    157  1.1  mrg   mpfr_set_prec (y, 43);
    158  1.1  mrg   mpfr_set_str_binary (x, "0.111001101100000110011001010000101");
    159  1.1  mrg   mpfr_atanh (y, x, MPFR_RNDZ);
    160  1.1  mrg   mpfr_init2 (z, 43);
    161  1.1  mrg   mpfr_set_str_binary (z, "1.01111010110001101001000000101101011110101");
    162  1.1  mrg   if (mpfr_cmp (y, z))
    163  1.1  mrg     {
    164  1.1  mrg       printf ("Error: mpfr_atanh (3)\n");
    165  1.1  mrg       mpfr_print_binary (y); printf ("\n");
    166  1.1  mrg       exit (1);
    167  1.1  mrg     }
    168  1.1  mrg 
    169  1.1  mrg   mpfr_clear (x);
    170  1.1  mrg   mpfr_clear (y);
    171  1.1  mrg   mpfr_clear (z);
    172  1.1  mrg }
    173  1.1  mrg 
    174  1.1  mrg int
    175  1.1  mrg main (int argc, char *argv[])
    176  1.1  mrg {
    177  1.1  mrg   tests_start_mpfr ();
    178  1.1  mrg 
    179  1.1  mrg   special ();
    180  1.1  mrg 
    181  1.1  mrg   test_generic (2, 100, 25);
    182  1.1  mrg 
    183  1.1  mrg   data_check ("data/atanh", mpfr_atanh, "mpfr_atanh");
    184  1.1  mrg   bad_cases (mpfr_atanh, mpfr_tanh, "mpfr_atanh", 256, -128, 9,
    185  1.1  mrg              4, 128, 800, 100);
    186  1.1  mrg 
    187  1.1  mrg   tests_end_mpfr ();
    188  1.1  mrg   return 0;
    189  1.1  mrg }
    190