tcbrt.c revision 1.1.1.5
1/* Test file for mpfr_cbrt.
2
3Copyright 2002-2020 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
25static void
26special (void)
27{
28  mpfr_t x, y;
29  int inex;
30
31  mpfr_init (x);
32  mpfr_init (y);
33
34  /* cbrt(NaN) = NaN */
35  mpfr_set_nan (x);
36  inex = mpfr_cbrt (y, x, MPFR_RNDN);
37  if (!mpfr_nan_p (y))
38    {
39      printf ("Error: cbrt(NaN) is not NaN\n");
40      exit (1);
41    }
42  if (inex != 0)
43    {
44      printf ("Error: cbrt(NaN): incorrect ternary value %d\n", inex);
45      exit (1);
46    }
47
48  /* cbrt(+Inf) = +Inf */
49  mpfr_set_inf (x, 1);
50  inex = mpfr_cbrt (y, x, MPFR_RNDN);
51  if (!mpfr_inf_p (y) || mpfr_sgn (y) < 0)
52    {
53      printf ("Error: cbrt(+Inf) <> +Inf\n");
54      exit (1);
55    }
56  if (inex != 0)
57    {
58      printf ("Error: cbrt(+Inf): incorrect ternary value %d\n", inex);
59      exit (1);
60    }
61
62  /* cbrt(-Inf) =  -Inf */
63  mpfr_set_inf (x, -1);
64  inex = mpfr_cbrt (y, x, MPFR_RNDN);
65  if (!mpfr_inf_p (y) || mpfr_sgn (y) > 0)
66    {
67      printf ("Error: cbrt(-Inf) <> -Inf\n");
68      exit (1);
69    }
70  if (inex != 0)
71    {
72      printf ("Error: cbrt(-Inf): incorrect ternary value %d\n", inex);
73      exit (1);
74    }
75
76  /* cbrt(+/-0) =  +/-0 */
77  mpfr_set_ui (x, 0, MPFR_RNDN);
78  inex = mpfr_cbrt (y, x, MPFR_RNDN);
79  if (MPFR_NOTZERO (y) || MPFR_IS_NEG (y))
80    {
81      printf ("Error: cbrt(+0) <> +0\n");
82      exit (1);
83    }
84  if (inex != 0)
85    {
86      printf ("Error: cbrt(+0): incorrect ternary value %d\n", inex);
87      exit (1);
88    }
89  mpfr_neg (x, x, MPFR_RNDN);
90  inex = mpfr_cbrt (y, x, MPFR_RNDN);
91  if (MPFR_NOTZERO (y) || MPFR_IS_POS (y))
92    {
93      printf ("Error: cbrt(-0) <> -0\n");
94      exit (1);
95    }
96  if (inex != 0)
97    {
98      printf ("Error: cbrt(-0): incorrect ternary value %d\n", inex);
99      exit (1);
100    }
101
102  mpfr_set_prec (x, 53);
103  mpfr_set_str (x, "8.39005285514734966412e-01", 10, MPFR_RNDN);
104  mpfr_cbrt (x, x, MPFR_RNDN);
105  if (mpfr_cmp_str1 (x, "9.43166207799662426048e-01"))
106    {
107      printf ("Error in crbrt (1)\n");
108      exit (1);
109    }
110
111  mpfr_set_prec (x, 32);
112  mpfr_set_prec (y, 32);
113  mpfr_set_str_binary (x, "0.10000100001100101001001001011001");
114  mpfr_cbrt (x, x, MPFR_RNDN);
115  mpfr_set_str_binary (y, "0.11001101011000100111000111111001");
116  if (mpfr_cmp (x, y))
117    {
118      printf ("Error in cbrt (2)\n");
119      exit (1);
120    }
121
122  mpfr_set_prec (x, 32);
123  mpfr_set_prec (y, 32);
124  mpfr_set_str_binary (x, "-0.1100001110110000010101011001011");
125  mpfr_cbrt (x, x, MPFR_RNDD);
126  mpfr_set_str_binary (y, "-0.11101010000100100101000101011001");
127  if (mpfr_cmp (x, y))
128    {
129      printf ("Error in cbrt (3)\n");
130      exit (1);
131    }
132
133  mpfr_set_prec (x, 82);
134  mpfr_set_prec (y, 27);
135  mpfr_set_str_binary (x, "0.1010001111011101011011000111001011001101100011110110010011011011011010011001100101e-7");
136  mpfr_cbrt (y, x, MPFR_RNDD);
137  mpfr_set_str_binary (x, "0.101011110001110001000100011E-2");
138  if (mpfr_cmp (x, y))
139    {
140      printf ("Error in cbrt (4)\n");
141      exit (1);
142    }
143
144  mpfr_set_prec (x, 204);
145  mpfr_set_prec (y, 38);
146  mpfr_set_str_binary (x, "0.101000000001101000000001100111111011111001110110100001111000100110100111001101100111110001110001011011010110010011100101111001111100001010010100111011101100000011011000101100010000000011000101001010001001E-5");
147  mpfr_cbrt (y, x, MPFR_RNDD);
148  mpfr_set_str_binary (x, "0.10001001111010011011101000010110110010E-1");
149  if (mpfr_cmp (x, y))
150    {
151      printf ("Error in cbrt (5)\n");
152      exit (1);
153    }
154
155  /* Bug (in the compiler?) found on Linux/m68k with gcc 4.0.2 */
156  mpfr_set_prec (x, 5);
157  mpfr_set_prec (y, 5);
158  mpfr_set_str_binary (x, "1.1000E-2");
159  mpfr_cbrt (y, x, MPFR_RNDN);
160  mpfr_set_str_binary (x, "1.0111E-1");
161  if (mpfr_cmp (x, y))
162    {
163      printf ("Error in cbrt (6)\n");
164      exit (1);
165    }
166
167  mpfr_clear (x);
168  mpfr_clear (y);
169}
170
171#define TEST_FUNCTION mpfr_cbrt
172#include "tgeneric.c"
173
174static int
175cube (mpfr_ptr a, mpfr_srcptr b, mpfr_rnd_t rnd_mode)
176{
177  return mpfr_pow_ui (a, b, 3, rnd_mode);
178}
179
180int
181main (void)
182{
183  mpfr_t x;
184  int r, inex;
185  mpfr_prec_t p;
186
187  tests_start_mpfr ();
188
189  special ();
190
191  mpfr_init (x);
192
193  for (p = 2; p < 100; p++)
194    {
195      mpfr_set_prec (x, p);
196      for (r = 0; r < MPFR_RND_MAX; r++)
197        {
198          mpfr_set_ui (x, 1, MPFR_RNDN);
199          inex = mpfr_cbrt (x, x, (mpfr_rnd_t) r);
200          if (mpfr_cmp_ui (x, 1) || inex != 0)
201            {
202              printf ("Error in mpfr_cbrt for x=1, rnd=%s\ngot ",
203                      mpfr_print_rnd_mode ((mpfr_rnd_t) r));
204              mpfr_dump (x);
205              printf ("inex = %d\n", inex);
206              exit (1);
207            }
208
209          mpfr_set_si (x, -1, MPFR_RNDN);
210          inex = mpfr_cbrt (x, x, (mpfr_rnd_t) r);
211          if (mpfr_cmp_si (x, -1) || inex != 0)
212            {
213              printf ("Error in mpfr_cbrt for x=-1, rnd=%s\ngot ",
214                      mpfr_print_rnd_mode ((mpfr_rnd_t) r));
215              mpfr_dump (x);
216              printf ("inex = %d\n", inex);
217              exit (1);
218            }
219
220          if (p >= 5)
221            {
222              int i;
223              for (i = -12; i <= 12; i++)
224                {
225                  mpfr_set_ui (x, 27, MPFR_RNDN);
226                  mpfr_mul_2si (x, x, 3*i, MPFR_RNDN);
227                  inex = mpfr_cbrt (x, x, MPFR_RNDN);
228                  if (mpfr_cmp_si_2exp (x, 3, i) || inex != 0)
229                    {
230                      printf ("Error in mpfr_cbrt for "
231                              "x = 27.0 * 2^(%d), rnd=%s\ngot ",
232                              3*i, mpfr_print_rnd_mode ((mpfr_rnd_t) r));
233                      mpfr_dump (x);
234                      printf (", expected 3 * 2^(%d)\n", i);
235                      printf ("inex = %d, expected 0\n", inex);
236                      exit (1);
237                    }
238                }
239            }
240        }
241    }
242  mpfr_clear (x);
243
244  test_generic (MPFR_PREC_MIN, 200, 10);
245
246  data_check ("data/cbrt", mpfr_cbrt, "mpfr_cbrt");
247  bad_cases (mpfr_cbrt, cube, "mpfr_cbrt", 256, -256, 255, 4, 128, 200, 50);
248
249  tests_end_mpfr ();
250  return 0;
251}
252