xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tpowr.c (revision ba125506a622fe649968631a56eba5d42ff57863)
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