1/* Test file for mpfr_powr. 2 3Copyright 2021-2023 Free Software Foundation, Inc. 4Contributed by the AriC and Caramba projects, INRIA. 5 6This file is part of the GNU MPFR Library. 7 8The GNU MPFR Library is free software; you can redistribute it and/or modify 9it under the terms of the GNU Lesser General Public License as published by 10the Free Software Foundation; either version 3 of the License, or (at your 11option) any later version. 12 13The GNU MPFR Library is distributed in the hope that it will be useful, but 14WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 16License for more details. 17 18You should have received a copy of the GNU Lesser General Public License 19along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 20https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2151 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 */ 26static void 27check_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 207int 208main (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} 219