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