(root)/
mpfr-4.2.1/
tests/
tacosu.c
       1  /* Test file for mpfr_acosu.
       2  
       3  Copyright 2021-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_acosu
      26  #define ULONG_ARG2
      27  #include "tgeneric.c"
      28  
      29  int
      30  main (void)
      31  {
      32    mpfr_t x, y;
      33    int r, inex;
      34    int unsigned long u;
      35  
      36    tests_start_mpfr ();
      37  
      38    mpfr_init (x);
      39    mpfr_init (y);
      40  
      41    /* check singular cases */
      42    MPFR_SET_NAN(x);
      43    mpfr_acosu (y, x, 1, MPFR_RNDN);
      44    if (mpfr_nan_p (y) == 0)
      45      {
      46        printf ("Error: acosu (NaN, 1) != NaN\n");
      47        exit (1);
      48      }
      49  
      50    mpfr_set_inf (x, 1);
      51    mpfr_acosu (y, x, 1, MPFR_RNDN);
      52    if (mpfr_nan_p (y) == 0)
      53      {
      54        printf ("Error: acosu (+Inf, 1) != NaN\n");
      55        exit (1);
      56      }
      57  
      58    mpfr_set_inf (x, -1);
      59    mpfr_acosu (y, x, 1, MPFR_RNDN);
      60    if (mpfr_nan_p (y) == 0)
      61      {
      62        printf ("Error: acosu (-Inf, 1) != NaN\n");
      63        exit (1);
      64      }
      65  
      66    /* acosu (0,u) = u/4 */
      67    RND_LOOP (r)
      68      {
      69        mpfr_set_ui (x, 0, MPFR_RNDN); /* exact */
      70        mpfr_acosu (y, x, 17, (mpfr_rnd_t) r);
      71        mpfr_set_ui_2exp (x, 17, -2, MPFR_RNDN);
      72        if (!mpfr_equal_p (x, y))
      73          {
      74            printf ("Error: acosu(0,17) != 17/4 for rnd=%s\n",
      75                    mpfr_print_rnd_mode ((mpfr_rnd_t) r));
      76            exit (1);
      77          }
      78      }
      79  
      80    /* check case |x| > 1 */
      81    mpfr_set_ui (x, 2, MPFR_RNDN);
      82    mpfr_acosu (y, x, 1, MPFR_RNDN);
      83    if (mpfr_nan_p (y) == 0)
      84      {
      85        printf ("Error: acosu (2, 1) != NaN\n");
      86        exit (1);
      87      }
      88  
      89    mpfr_set_si (x, -2, MPFR_RNDN);
      90    mpfr_acosu (y, x, 1, MPFR_RNDN);
      91    if (mpfr_nan_p (y) == 0)
      92      {
      93        printf ("Error: acosu (-2, 1) != NaN\n");
      94        exit (1);
      95      }
      96  
      97    /* check case |x| > 1 with u=0 */
      98    mpfr_set_ui (x, 2, MPFR_RNDN);
      99    mpfr_acosu (y, x, 0, MPFR_RNDN);
     100    if (mpfr_nan_p (y) == 0)
     101      {
     102        printf ("Error: acosu (2, 0) != NaN\n");
     103        exit (1);
     104      }
     105  
     106    mpfr_set_si (x, -2, MPFR_RNDN);
     107    mpfr_acosu (y, x, 0, MPFR_RNDN);
     108    if (mpfr_nan_p (y) == 0)
     109      {
     110        printf ("Error: acosu (-2, 0) != NaN\n");
     111        exit (1);
     112      }
     113  
     114    /* check case u=0 */
     115    mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN);
     116    mpfr_acosu (y, x, 0, MPFR_RNDN);
     117    if (!mpfr_zero_p (y) || MPFR_SIGN(y) < 0)
     118      {
     119        printf ("Error: acosu (1/2, 0) != +0\n");
     120        printf ("got: "); mpfr_dump (y);
     121        exit (1);
     122      }
     123  
     124    /* acosu (1,u) = +0 */
     125    mpfr_set_ui (x, 1, MPFR_RNDN);
     126    mpfr_acosu (y, x, 1, MPFR_RNDN);
     127    if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
     128      {
     129        printf ("Error: acosu(1,1) != +0.0\n");
     130        exit (1);
     131      }
     132  
     133    /* acosu (-1,u) = u/2 */
     134    RND_LOOP (r)
     135      {
     136        mpfr_set_si (x, -1, MPFR_RNDN); /* exact */
     137        mpfr_acosu (y, x, 17, (mpfr_rnd_t) r);
     138        mpfr_set_ui_2exp (x, 17, -1, MPFR_RNDN);
     139        if (!mpfr_equal_p (x, y))
     140          {
     141            printf ("Error: acosu(1,17) != 17/2 for rnd=%s\n",
     142                    mpfr_print_rnd_mode ((mpfr_rnd_t) r));
     143            exit (1);
     144          }
     145      }
     146  
     147    /* acosu (1/2,u) = u/6 */
     148    for (u = 1; u < 100; u++)
     149       RND_LOOP (r)
     150         {
     151           mpfr_set_ui_2exp (x, 1, -1, MPFR_RNDN); /* exact */
     152           mpfr_acosu (y, x, u, (mpfr_rnd_t) r);
     153           inex = mpfr_set_ui (x, u, MPFR_RNDN);
     154           MPFR_ASSERTN(inex == 0);
     155           inex = mpfr_div_ui (x, x, 6, (mpfr_rnd_t) r);
     156           if ((r != MPFR_RNDF || inex == 0) && !mpfr_equal_p (x, y))
     157             {
     158               printf ("Error: acosu(1/2,u) != u/6 for u=%lu and rnd=%s\n",
     159                       u, mpfr_print_rnd_mode ((mpfr_rnd_t) r));
     160               printf ("got: "); mpfr_dump (y);
     161               exit (1);
     162             }
     163         }
     164  
     165    /* acosu (-1/2,u) = u/3 */
     166    for (u = 1; u < 100; u++)
     167       RND_LOOP (r)
     168         {
     169           mpfr_set_si_2exp (x, -1, -1, MPFR_RNDN); /* exact */
     170           mpfr_acosu (y, x, u, (mpfr_rnd_t) r);
     171           inex = mpfr_set_ui (x, u, MPFR_RNDN);
     172           MPFR_ASSERTN(inex == 0);
     173           inex = mpfr_div_ui (x, x, 3, (mpfr_rnd_t) r);
     174           if ((r != MPFR_RNDF || inex == 0) && !mpfr_equal_p (x, y))
     175             {
     176               printf ("Error: acosu(-1/2,u) != u/3 for u=%lu and rnd=%s\n",
     177                       u, mpfr_print_rnd_mode ((mpfr_rnd_t) r));
     178               printf ("got: "); mpfr_dump (y);
     179               exit (1);
     180             }
     181         }
     182  
     183    test_generic (MPFR_PREC_MIN, 100, 100);
     184  
     185    mpfr_clear (x);
     186    mpfr_clear (y);
     187  
     188    tests_end_mpfr ();
     189    return 0;
     190  }