(root)/
mpfr-4.2.1/
tests/
tpowr.c
       1  /* Test file for mpfr_powr.
       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  /* check the special rules from IEEE 754-2019 */
      26  static void
      27  check_ieee754_2019 (void)
      28  {
      29    mpfr_t x, y, z;
      30    mpfr_prec_t p = 5;
      31  
      32    mpfr_init2 (x, p);
      33    mpfr_init2 (y, p);
      34    mpfr_init2 (z, p);
      35  
      36    /* powr (x, ±0) is 1 for finite x > 0 */
      37    mpfr_set_ui (x, 17, MPFR_RNDN);
      38    mpfr_set_zero (y, 1);
      39    mpfr_powr (z, x, y, MPFR_RNDN);
      40    MPFR_ASSERTN(mpfr_cmp_ui (z, 1) == 0);
      41    mpfr_set_zero (y, -1);
      42    mpfr_powr (z, x, y, MPFR_RNDN);
      43    MPFR_ASSERTN(mpfr_cmp_ui (z, 1) == 0);
      44  
      45    /* powr (±0, y) is +∞ and signals divideByZero for finite y < 0 */
      46    mpfr_set_si (y, -17, MPFR_RNDN);
      47    mpfr_set_zero (x, 1);
      48    mpfr_clear_divby0 ();
      49    mpfr_powr (z, x, y, MPFR_RNDN);
      50    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
      51    mpfr_set_zero (x, -1);
      52    mpfr_clear_divby0 ();
      53    mpfr_powr (z, x, y, MPFR_RNDN);
      54    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
      55    /* try also y an even negative integer */
      56    mpfr_set_si (y, -42, MPFR_RNDN);
      57    mpfr_set_zero (x, 1);
      58    mpfr_clear_divby0 ();
      59    mpfr_powr (z, x, y, MPFR_RNDN);
      60    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
      61    mpfr_set_zero (x, -1);
      62    mpfr_clear_divby0 ();
      63    mpfr_powr (z, x, y, MPFR_RNDN);
      64    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
      65    /* and y not an integer */
      66    mpfr_set_si_2exp (y, -17, -1, MPFR_RNDN);
      67    mpfr_set_zero (x, 1);
      68    mpfr_clear_divby0 ();
      69    mpfr_powr (z, x, y, MPFR_RNDN);
      70    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
      71    mpfr_set_zero (x, -1);
      72    mpfr_clear_divby0 ();
      73    mpfr_powr (z, x, y, MPFR_RNDN);
      74    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
      75  
      76    /* powr (±0, −∞) is +∞ */
      77    mpfr_set_inf (y, -1);
      78    mpfr_set_zero (x, 1);
      79    mpfr_clear_divby0 ();
      80    mpfr_powr (z, x, y, MPFR_RNDN);
      81    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && !mpfr_divby0_p ());
      82    mpfr_set_zero (x, -1);
      83    mpfr_clear_divby0 ();
      84    mpfr_powr (z, x, y, MPFR_RNDN);
      85    MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && !mpfr_divby0_p ());
      86  
      87    /* powr (±0, y) is +0 for y > 0 */
      88    mpfr_set_ui (y, 17, MPFR_RNDN);
      89    mpfr_set_zero (x, 1);
      90    mpfr_powr (z, x, y, MPFR_RNDN);
      91    MPFR_ASSERTN(mpfr_zero_p (z) && !mpfr_signbit (z));
      92    mpfr_set_zero (x, -1);
      93    mpfr_powr (z, x, y, MPFR_RNDN);
      94    MPFR_ASSERTN(mpfr_zero_p (z) && !mpfr_signbit (z));
      95  
      96    /* powr (+1, y) is 1 for finite y */
      97    mpfr_set_ui (x, 1, MPFR_RNDN);
      98    mpfr_set_ui (y, 17, MPFR_RNDN);
      99    mpfr_powr (z, x, y, MPFR_RNDN);
     100    MPFR_ASSERTN(mpfr_cmp_ui (z, 1) == 0);
     101  
     102    /* powr (x, y) signals the invalid operation exception for x < 0 */
     103    mpfr_set_si (x, -1, MPFR_RNDN);
     104    mpfr_set_si (y, 1, MPFR_RNDN);
     105    mpfr_clear_nanflag ();
     106    mpfr_powr (z, x, y, MPFR_RNDN);
     107    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     108  
     109    /* powr (±0, ±0) signals the invalid operation exception */
     110    mpfr_set_zero (x, 1);
     111    mpfr_set_zero (y, 1);
     112    mpfr_clear_nanflag ();
     113    mpfr_powr (z, x, y, MPFR_RNDN);
     114    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     115    mpfr_set_zero (y, -1);
     116    mpfr_clear_nanflag ();
     117    mpfr_powr (z, x, y, MPFR_RNDN);
     118    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     119    mpfr_set_zero (x, -1);
     120    mpfr_set_zero (y, 1);
     121    mpfr_clear_nanflag ();
     122    mpfr_powr (z, x, y, MPFR_RNDN);
     123    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     124    mpfr_set_zero (y, -1);
     125    mpfr_clear_nanflag ();
     126    mpfr_powr (z, x, y, MPFR_RNDN);
     127    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     128  
     129    /* powr (+∞, ±0) signals the invalid operation exception */
     130    mpfr_set_inf (x, 1);
     131    mpfr_set_zero (y, 1);
     132    mpfr_clear_nanflag ();
     133    mpfr_powr (z, x, y, MPFR_RNDN);
     134    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     135    mpfr_set_zero (y, -1);
     136    mpfr_clear_nanflag ();
     137    mpfr_powr (z, x, y, MPFR_RNDN);
     138    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     139  
     140    /* powr (+1, ±∞) signals the invalid operation exception */
     141    mpfr_set_ui (x, 1, MPFR_RNDN);
     142    mpfr_set_inf (y, 1);
     143    mpfr_clear_nanflag ();
     144    mpfr_powr (z, x, y, MPFR_RNDN);
     145    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     146    mpfr_set_inf (y, -1);
     147    mpfr_clear_nanflag ();
     148    mpfr_powr (z, x, y, MPFR_RNDN);
     149    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     150  
     151    /* powr (x, qNaN) is qNaN for x ≥ 0 */
     152    mpfr_set_nan (y);
     153    mpfr_set_zero (x, -1);
     154    mpfr_clear_nanflag ();
     155    mpfr_powr (z, x, y, MPFR_RNDN);
     156    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     157    mpfr_set_zero (x, 1);
     158    mpfr_clear_nanflag ();
     159    mpfr_powr (z, x, y, MPFR_RNDN);
     160    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     161    mpfr_set_ui (x, 17, MPFR_RNDN);
     162    mpfr_clear_nanflag ();
     163    mpfr_powr (z, x, y, MPFR_RNDN);
     164    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     165    mpfr_set_inf (x, 1);
     166    mpfr_clear_nanflag ();
     167    mpfr_powr (z, x, y, MPFR_RNDN);
     168    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     169  
     170    /* powr (qNaN, y) is qNaN */
     171    mpfr_set_nan (x);
     172    mpfr_set_inf (y, 1);
     173    mpfr_clear_nanflag ();
     174    mpfr_powr (z, x, y, MPFR_RNDN);
     175    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     176    mpfr_set_inf (y, -1);
     177    mpfr_clear_nanflag ();
     178    mpfr_powr (z, x, y, MPFR_RNDN);
     179    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     180    mpfr_set_zero (y, 1);
     181    mpfr_clear_nanflag ();
     182    mpfr_powr (z, x, y, MPFR_RNDN);
     183    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     184    mpfr_set_zero (y, -1);
     185    mpfr_clear_nanflag ();
     186    mpfr_powr (z, x, y, MPFR_RNDN);
     187    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     188    mpfr_set_si (y, 17, MPFR_RNDN);
     189    mpfr_clear_nanflag ();
     190    mpfr_powr (z, x, y, MPFR_RNDN);
     191    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     192    mpfr_set_si (y, -17, MPFR_RNDN);
     193    mpfr_clear_nanflag ();
     194    mpfr_powr (z, x, y, MPFR_RNDN);
     195    MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
     196  
     197    mpfr_clear (x);
     198    mpfr_clear (y);
     199    mpfr_clear (z);
     200  }
     201  
     202  #define TEST_FUNCTION mpfr_powr
     203  #define TWO_ARGS
     204  #define TEST_RANDOM_POS 16 /* the 2nd argument is negative with prob. 16/512 */
     205  #include "tgeneric.c"
     206  
     207  int
     208  main (int argc, char **argv)
     209  {
     210    tests_start_mpfr ();
     211  
     212    check_ieee754_2019 ();
     213  
     214    test_generic (MPFR_PREC_MIN, 100, 100);
     215  
     216    tests_end_mpfr ();
     217    return 0;
     218  }