1*ba125506Smrg /* Test file for mpfr_powr.
2*ba125506Smrg
3*ba125506Smrg Copyright 2021-2023 Free Software Foundation, Inc.
4*ba125506Smrg Contributed by the AriC and Caramba projects, INRIA.
5*ba125506Smrg
6*ba125506Smrg This file is part of the GNU MPFR Library.
7*ba125506Smrg
8*ba125506Smrg The GNU MPFR Library is free software; you can redistribute it and/or modify
9*ba125506Smrg it under the terms of the GNU Lesser General Public License as published by
10*ba125506Smrg the Free Software Foundation; either version 3 of the License, or (at your
11*ba125506Smrg option) any later version.
12*ba125506Smrg
13*ba125506Smrg The GNU MPFR Library is distributed in the hope that it will be useful, but
14*ba125506Smrg WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15*ba125506Smrg or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
16*ba125506Smrg License for more details.
17*ba125506Smrg
18*ba125506Smrg You should have received a copy of the GNU Lesser General Public License
19*ba125506Smrg along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see
20*ba125506Smrg https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
21*ba125506Smrg 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
22*ba125506Smrg
23*ba125506Smrg #include "mpfr-test.h"
24*ba125506Smrg
25*ba125506Smrg /* check the special rules from IEEE 754-2019 */
26*ba125506Smrg static void
check_ieee754_2019(void)27*ba125506Smrg check_ieee754_2019 (void)
28*ba125506Smrg {
29*ba125506Smrg mpfr_t x, y, z;
30*ba125506Smrg mpfr_prec_t p = 5;
31*ba125506Smrg
32*ba125506Smrg mpfr_init2 (x, p);
33*ba125506Smrg mpfr_init2 (y, p);
34*ba125506Smrg mpfr_init2 (z, p);
35*ba125506Smrg
36*ba125506Smrg /* powr (x, ±0) is 1 for finite x > 0 */
37*ba125506Smrg mpfr_set_ui (x, 17, MPFR_RNDN);
38*ba125506Smrg mpfr_set_zero (y, 1);
39*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
40*ba125506Smrg MPFR_ASSERTN(mpfr_cmp_ui (z, 1) == 0);
41*ba125506Smrg mpfr_set_zero (y, -1);
42*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
43*ba125506Smrg MPFR_ASSERTN(mpfr_cmp_ui (z, 1) == 0);
44*ba125506Smrg
45*ba125506Smrg /* powr (±0, y) is +∞ and signals divideByZero for finite y < 0 */
46*ba125506Smrg mpfr_set_si (y, -17, MPFR_RNDN);
47*ba125506Smrg mpfr_set_zero (x, 1);
48*ba125506Smrg mpfr_clear_divby0 ();
49*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
50*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
51*ba125506Smrg mpfr_set_zero (x, -1);
52*ba125506Smrg mpfr_clear_divby0 ();
53*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
54*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
55*ba125506Smrg /* try also y an even negative integer */
56*ba125506Smrg mpfr_set_si (y, -42, MPFR_RNDN);
57*ba125506Smrg mpfr_set_zero (x, 1);
58*ba125506Smrg mpfr_clear_divby0 ();
59*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
60*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
61*ba125506Smrg mpfr_set_zero (x, -1);
62*ba125506Smrg mpfr_clear_divby0 ();
63*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
64*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
65*ba125506Smrg /* and y not an integer */
66*ba125506Smrg mpfr_set_si_2exp (y, -17, -1, MPFR_RNDN);
67*ba125506Smrg mpfr_set_zero (x, 1);
68*ba125506Smrg mpfr_clear_divby0 ();
69*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
70*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
71*ba125506Smrg mpfr_set_zero (x, -1);
72*ba125506Smrg mpfr_clear_divby0 ();
73*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
74*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && mpfr_divby0_p ());
75*ba125506Smrg
76*ba125506Smrg /* powr (±0, −∞) is +∞ */
77*ba125506Smrg mpfr_set_inf (y, -1);
78*ba125506Smrg mpfr_set_zero (x, 1);
79*ba125506Smrg mpfr_clear_divby0 ();
80*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
81*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && !mpfr_divby0_p ());
82*ba125506Smrg mpfr_set_zero (x, -1);
83*ba125506Smrg mpfr_clear_divby0 ();
84*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
85*ba125506Smrg MPFR_ASSERTN(mpfr_inf_p (z) && mpfr_sgn (z) > 0 && !mpfr_divby0_p ());
86*ba125506Smrg
87*ba125506Smrg /* powr (±0, y) is +0 for y > 0 */
88*ba125506Smrg mpfr_set_ui (y, 17, MPFR_RNDN);
89*ba125506Smrg mpfr_set_zero (x, 1);
90*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
91*ba125506Smrg MPFR_ASSERTN(mpfr_zero_p (z) && !mpfr_signbit (z));
92*ba125506Smrg mpfr_set_zero (x, -1);
93*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
94*ba125506Smrg MPFR_ASSERTN(mpfr_zero_p (z) && !mpfr_signbit (z));
95*ba125506Smrg
96*ba125506Smrg /* powr (+1, y) is 1 for finite y */
97*ba125506Smrg mpfr_set_ui (x, 1, MPFR_RNDN);
98*ba125506Smrg mpfr_set_ui (y, 17, MPFR_RNDN);
99*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
100*ba125506Smrg MPFR_ASSERTN(mpfr_cmp_ui (z, 1) == 0);
101*ba125506Smrg
102*ba125506Smrg /* powr (x, y) signals the invalid operation exception for x < 0 */
103*ba125506Smrg mpfr_set_si (x, -1, MPFR_RNDN);
104*ba125506Smrg mpfr_set_si (y, 1, MPFR_RNDN);
105*ba125506Smrg mpfr_clear_nanflag ();
106*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
107*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
108*ba125506Smrg
109*ba125506Smrg /* powr (±0, ±0) signals the invalid operation exception */
110*ba125506Smrg mpfr_set_zero (x, 1);
111*ba125506Smrg mpfr_set_zero (y, 1);
112*ba125506Smrg mpfr_clear_nanflag ();
113*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
114*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
115*ba125506Smrg mpfr_set_zero (y, -1);
116*ba125506Smrg mpfr_clear_nanflag ();
117*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
118*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
119*ba125506Smrg mpfr_set_zero (x, -1);
120*ba125506Smrg mpfr_set_zero (y, 1);
121*ba125506Smrg mpfr_clear_nanflag ();
122*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
123*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
124*ba125506Smrg mpfr_set_zero (y, -1);
125*ba125506Smrg mpfr_clear_nanflag ();
126*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
127*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
128*ba125506Smrg
129*ba125506Smrg /* powr (+∞, ±0) signals the invalid operation exception */
130*ba125506Smrg mpfr_set_inf (x, 1);
131*ba125506Smrg mpfr_set_zero (y, 1);
132*ba125506Smrg mpfr_clear_nanflag ();
133*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
134*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
135*ba125506Smrg mpfr_set_zero (y, -1);
136*ba125506Smrg mpfr_clear_nanflag ();
137*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
138*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
139*ba125506Smrg
140*ba125506Smrg /* powr (+1, ±∞) signals the invalid operation exception */
141*ba125506Smrg mpfr_set_ui (x, 1, MPFR_RNDN);
142*ba125506Smrg mpfr_set_inf (y, 1);
143*ba125506Smrg mpfr_clear_nanflag ();
144*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
145*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
146*ba125506Smrg mpfr_set_inf (y, -1);
147*ba125506Smrg mpfr_clear_nanflag ();
148*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
149*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
150*ba125506Smrg
151*ba125506Smrg /* powr (x, qNaN) is qNaN for x ≥ 0 */
152*ba125506Smrg mpfr_set_nan (y);
153*ba125506Smrg mpfr_set_zero (x, -1);
154*ba125506Smrg mpfr_clear_nanflag ();
155*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
156*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
157*ba125506Smrg mpfr_set_zero (x, 1);
158*ba125506Smrg mpfr_clear_nanflag ();
159*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
160*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
161*ba125506Smrg mpfr_set_ui (x, 17, MPFR_RNDN);
162*ba125506Smrg mpfr_clear_nanflag ();
163*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
164*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
165*ba125506Smrg mpfr_set_inf (x, 1);
166*ba125506Smrg mpfr_clear_nanflag ();
167*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
168*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
169*ba125506Smrg
170*ba125506Smrg /* powr (qNaN, y) is qNaN */
171*ba125506Smrg mpfr_set_nan (x);
172*ba125506Smrg mpfr_set_inf (y, 1);
173*ba125506Smrg mpfr_clear_nanflag ();
174*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
175*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
176*ba125506Smrg mpfr_set_inf (y, -1);
177*ba125506Smrg mpfr_clear_nanflag ();
178*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
179*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
180*ba125506Smrg mpfr_set_zero (y, 1);
181*ba125506Smrg mpfr_clear_nanflag ();
182*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
183*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
184*ba125506Smrg mpfr_set_zero (y, -1);
185*ba125506Smrg mpfr_clear_nanflag ();
186*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
187*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
188*ba125506Smrg mpfr_set_si (y, 17, MPFR_RNDN);
189*ba125506Smrg mpfr_clear_nanflag ();
190*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
191*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
192*ba125506Smrg mpfr_set_si (y, -17, MPFR_RNDN);
193*ba125506Smrg mpfr_clear_nanflag ();
194*ba125506Smrg mpfr_powr (z, x, y, MPFR_RNDN);
195*ba125506Smrg MPFR_ASSERTN(mpfr_nan_p (z) && mpfr_nanflag_p ());
196*ba125506Smrg
197*ba125506Smrg mpfr_clear (x);
198*ba125506Smrg mpfr_clear (y);
199*ba125506Smrg mpfr_clear (z);
200*ba125506Smrg }
201*ba125506Smrg
202*ba125506Smrg #define TEST_FUNCTION mpfr_powr
203*ba125506Smrg #define TWO_ARGS
204*ba125506Smrg #define TEST_RANDOM_POS 16 /* the 2nd argument is negative with prob. 16/512 */
205*ba125506Smrg #include "tgeneric.c"
206*ba125506Smrg
207*ba125506Smrg int
main(int argc,char ** argv)208*ba125506Smrg main (int argc, char **argv)
209*ba125506Smrg {
210*ba125506Smrg tests_start_mpfr ();
211*ba125506Smrg
212*ba125506Smrg check_ieee754_2019 ();
213*ba125506Smrg
214*ba125506Smrg test_generic (MPFR_PREC_MIN, 100, 100);
215*ba125506Smrg
216*ba125506Smrg tests_end_mpfr ();
217*ba125506Smrg return 0;
218*ba125506Smrg }
219