(root)/
mpfr-4.2.1/
tests/
tatanh.c
       1  /* Test file for mpfr_atanh.
       2  
       3  Copyright 2001-2023 Free Software Foundation, Inc.
       4  Contributed by the AriC and Caramba projects, INRIA.
       5  
       6  This file is part of the GNU MPFR Library.
       7  
       8  The GNU MPFR Library is free software; you can redistribute it and/or modify
       9  it under the terms of the GNU Lesser General Public License as published by
      10  the Free Software Foundation; either version 3 of the License, or (at your
      11  option) any later version.
      12  
      13  The GNU MPFR Library is distributed in the hope that it will be useful, but
      14  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
      16  License for more details.
      17  
      18  You should have received a copy of the GNU Lesser General Public License
      19  along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
      20  https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
      21  51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
      22  
      23  #include "mpfr-test.h"
      24  
      25  #define TEST_FUNCTION mpfr_atanh
      26  #define TEST_RANDOM_EMAX 7
      27  #include "tgeneric.c"
      28  
      29  static void
      30  special (void)
      31  {
      32    mpfr_t x, y, z;
      33    int i;
      34  
      35    mpfr_init (x);
      36    mpfr_init (y);
      37  
      38    MPFR_SET_INF(x);
      39    mpfr_set_ui (y, 0, MPFR_RNDN);
      40    mpfr_atanh (x, y, MPFR_RNDN);
      41    if (MPFR_IS_INF(x) || MPFR_IS_NAN(x) )
      42      {
      43        printf ("Inf flag not clears in atanh!\n");
      44        exit (1);
      45      }
      46  
      47    MPFR_SET_NAN(x);
      48    mpfr_atanh (x, y, MPFR_RNDN);
      49    if (MPFR_IS_NAN(x) || MPFR_IS_INF(x))
      50      {
      51        printf ("NAN flag not clears in atanh!\n");
      52        exit (1);
      53      }
      54  
      55    /* atanh(+/-x) = NaN if x > 1 */
      56    for (i = 3; i <= 6; i++)
      57      {
      58        mpfr_set_si (x, i, MPFR_RNDN);
      59        mpfr_div_2ui (x, x, 1, MPFR_RNDN);
      60        mpfr_atanh (y, x, MPFR_RNDN);
      61        if (!mpfr_nan_p (y))
      62          {
      63            printf ("Error: mpfr_atanh(%d/2) <> NaN\n", i);
      64            exit (1);
      65          }
      66        mpfr_neg (x, x, MPFR_RNDN);
      67        mpfr_atanh (y, x, MPFR_RNDN);
      68        if (!mpfr_nan_p (y))
      69          {
      70            printf ("Error: mpfr_atanh(-%d/2) <> NaN\n", i);
      71            exit (1);
      72          }
      73      }
      74  
      75    /* atanh(+0) = +0, atanh(-0) = -0 */
      76    mpfr_set_ui (x, 0, MPFR_RNDN);
      77    mpfr_atanh (y, x, MPFR_RNDN);
      78    if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
      79      {
      80        printf ("Error: mpfr_atanh(+0) <> +0\n");
      81        exit (1);
      82      }
      83    mpfr_neg (x, x, MPFR_RNDN);
      84    mpfr_atanh (y, x, MPFR_RNDN);
      85    if (MPFR_NOTZERO (y) || MPFR_IS_POS (y))
      86      {
      87        printf ("Error: mpfr_atanh(-0) <> -0\n");
      88        exit (1);
      89      }
      90  
      91    MPFR_SET_NAN(x);
      92    mpfr_atanh (y, x, MPFR_RNDN);
      93    if (!mpfr_nan_p (y))
      94      {
      95        printf ("Error: mpfr_atanh(NaN) <> NaN\n");
      96        exit (1);
      97      }
      98  
      99    mpfr_set_inf (x, 1);
     100    mpfr_atanh (y, x, MPFR_RNDN);
     101    if (!mpfr_nan_p (y))
     102      {
     103        printf ("Error: mpfr_atanh(+Inf) <> NaN\n");
     104        mpfr_dump (y);
     105        exit (1);
     106      }
     107  
     108    mpfr_set_inf (x, -1);
     109    mpfr_atanh (y, x, MPFR_RNDN);
     110    if (!mpfr_nan_p (y))
     111      {
     112        printf ("Error: mpfr_atanh(-Inf) <> NaN\n");
     113        exit (1);
     114      }
     115  
     116    mpfr_set_ui (x, 1, MPFR_RNDN);
     117    mpfr_atanh (y, x, MPFR_RNDN);
     118    if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
     119      {
     120        printf ("Error: mpfr_atanh(1) <> +Inf\n");
     121        exit (1);
     122      }
     123  
     124    mpfr_set_si (x, -1, MPFR_RNDN);
     125    mpfr_atanh (y, x, MPFR_RNDN);
     126    if (!mpfr_inf_p (y) || mpfr_sgn (y) > 0)
     127      {
     128        printf ("Error: mpfr_atanh(-1) <> -Inf\n");
     129        exit (1);
     130      }
     131  
     132    mpfr_set_prec (x, 32);
     133    mpfr_set_prec (y, 32);
     134  
     135    mpfr_set_str_binary (x, "0.10001000001001011000100001E-6");
     136    mpfr_atanh (x, x, MPFR_RNDN);
     137    mpfr_set_str_binary (y, "0.10001000001001100101010110100001E-6");
     138    if (mpfr_cmp (x, y))
     139      {
     140        printf ("Error: mpfr_atanh (1)\n");
     141        exit (1);
     142      }
     143  
     144    mpfr_set_str_binary (x, "-0.1101011110111100111010011001011E-1");
     145    mpfr_atanh (x, x, MPFR_RNDN);
     146    mpfr_set_str_binary (y, "-0.11100110000100001111101100010111E-1");
     147    if (mpfr_cmp (x, y))
     148      {
     149        printf ("Error: mpfr_atanh (2)\n");
     150        exit (1);
     151      }
     152  
     153    mpfr_set_prec (x, 33);
     154    mpfr_set_prec (y, 43);
     155    mpfr_set_str_binary (x, "0.111001101100000110011001010000101");
     156    mpfr_atanh (y, x, MPFR_RNDZ);
     157    mpfr_init2 (z, 43);
     158    mpfr_set_str_binary (z, "1.01111010110001101001000000101101011110101");
     159    if (mpfr_cmp (y, z))
     160      {
     161        printf ("Error: mpfr_atanh (3)\n");
     162        mpfr_dump (y);
     163        exit (1);
     164      }
     165  
     166    mpfr_clear (x);
     167    mpfr_clear (y);
     168    mpfr_clear (z);
     169  }
     170  
     171  int
     172  main (int argc, char *argv[])
     173  {
     174    tests_start_mpfr ();
     175  
     176    special ();
     177  
     178    test_generic (MPFR_PREC_MIN, 100, 25);
     179  
     180    data_check ("data/atanh", mpfr_atanh, "mpfr_atanh");
     181    bad_cases (mpfr_atanh, mpfr_tanh, "mpfr_atanh", 256, -128, 8,
     182               4, 128, 800, 100);
     183  
     184    tests_end_mpfr ();
     185    return 0;
     186  }