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
check_ieee754_2019(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
main(int argc,char ** argv)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 }
219