xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tzeta_ui.c (revision 32d1c65c71fbdb65a012e8392a62a757dd6853e9)
1 /* Test file for mpfr_zeta_ui.
2 
3 Copyright 2005-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 #define TEST_FUNCTION mpfr_zeta_ui
26 
27 int
28 main (int argc, char *argv[])
29 {
30   unsigned int prec, yprec;
31   int rnd;
32   mpfr_t x, y, z, t;
33   unsigned long n;
34   int inex;
35   mpfr_exp_t emin, emax;
36   mpfr_flags_t flags, ex_flags;
37   int i;
38 
39   tests_start_mpfr ();
40 
41   emin = mpfr_get_emin ();
42   emax = mpfr_get_emax ();
43 
44   mpfr_init (x);
45   mpfr_init (y);
46   mpfr_init (z);
47   mpfr_init (t);
48 
49   if (argc >= 3) /* tzeta_ui n prec [rnd] */
50     {
51       mpfr_set_prec (x, atoi (argv[2]));
52       mpfr_zeta_ui (x, atoi (argv[1]),
53                     argc > 3 ? (mpfr_rnd_t) atoi (argv[3]) : MPFR_RNDN);
54       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN);
55       printf ("\n");
56       goto clear_and_exit;
57     }
58 
59   mpfr_set_prec (x, 33);
60   mpfr_set_prec (y, 33);
61   mpfr_zeta_ui (x, 3, MPFR_RNDZ);
62   mpfr_set_str_binary (y, "0.100110011101110100000000001001111E1");
63   if (mpfr_cmp (x, y))
64     {
65       printf ("Error for zeta(3), prec=33, MPFR_RNDZ\n");
66       printf ("expected "); mpfr_dump (y);
67       printf ("got      "); mpfr_dump (x);
68       exit (1);
69     }
70 
71   mpfr_clear_flags ();
72   inex = mpfr_zeta_ui (x, 0, MPFR_RNDN);
73   flags = __gmpfr_flags;
74   MPFR_ASSERTN (inex == 0 && mpfr_cmp_si_2exp (x, -1, -1) == 0 && flags == 0);
75 
76   for (i = -2; i <= 2; i += 2)
77     RND_LOOP_NO_RNDF (rnd)
78       {
79         int ex_inex;
80 
81         set_emin (i);
82         set_emax (i);
83         mpfr_clear_flags ();
84         inex = mpfr_zeta_ui (x, 0, (mpfr_rnd_t) rnd);
85         flags = __gmpfr_flags;
86         if (i < 0)
87           {
88             mpfr_set_inf (y, -1);
89             if (rnd == MPFR_RNDU || rnd == MPFR_RNDZ)
90               {
91                 mpfr_nextabove (y);
92                 ex_inex = 1;
93               }
94             else
95               {
96                 ex_inex = -1;
97               }
98             ex_flags = MPFR_FLAGS_OVERFLOW | MPFR_FLAGS_INEXACT;
99           }
100         else if (i > 0)
101           {
102             mpfr_set_zero (y, -1);
103             if (rnd == MPFR_RNDD || rnd == MPFR_RNDA)
104               {
105                 mpfr_nextbelow (y);
106                 ex_inex = -1;
107               }
108             else
109               {
110                 ex_inex = 1;
111               }
112             ex_flags = MPFR_FLAGS_UNDERFLOW | MPFR_FLAGS_INEXACT;
113           }
114         else
115           {
116             mpfr_set_str_binary (y, "-1e-1");
117             ex_inex = 0;
118             ex_flags = 0;
119           }
120         set_emin (emin);
121         set_emax (emax);
122         if (! (mpfr_equal_p (x, y) && MPFR_IS_NEG (x) &&
123                SAME_SIGN (inex, ex_inex) && flags == ex_flags))
124           {
125             printf ("Failure for zeta(0) in %s, exponent range [%d,%d]\n",
126                     mpfr_print_rnd_mode ((mpfr_rnd_t) rnd), i, i);
127             printf ("Expected ");
128             mpfr_dump (y);
129             printf ("  with inex ~ %d, flags =", ex_inex);
130             flags_out (ex_flags);
131             printf ("Got      ");
132             mpfr_dump (x);
133             printf ("  with inex = %d, flags =", inex);
134             flags_out (flags);
135             exit (1);
136           }
137       }
138 
139   mpfr_clear_divby0 ();
140   inex = mpfr_zeta_ui (x, 1, MPFR_RNDN);
141   MPFR_ASSERTN (inex == 0 && MPFR_IS_INF (x) && MPFR_IS_POS (x)
142                 && mpfr_divby0_p ());
143 
144   for (prec = MPFR_PREC_MIN; prec <= 100; prec++)
145     {
146       mpfr_set_prec (x, prec);
147       mpfr_set_prec (z, prec);
148       mpfr_set_prec (t, prec);
149       yprec = prec + 10;
150       mpfr_set_prec (y, yprec);
151 
152       for (n = 0; n < 50; n++)
153         RND_LOOP_NO_RNDF (rnd)
154           {
155             mpfr_zeta_ui (y, n, MPFR_RNDN);
156             if (mpfr_can_round (y, yprec, MPFR_RNDN, MPFR_RNDZ, prec
157                                 + (rnd == MPFR_RNDN)))
158               {
159                 mpfr_set (t, y, (mpfr_rnd_t) rnd);
160                 for (i = 0; i <= 1; i++)
161                   {
162                     if (i)
163                       {
164                         mpfr_exp_t e;
165 
166                         if (MPFR_IS_SINGULAR (t))
167                           break;
168                         e = mpfr_get_exp (t);
169                         set_emin (e);
170                         set_emax (e);
171                       }
172                     mpfr_zeta_ui (z, n, (mpfr_rnd_t) rnd);
173                     if (i)
174                       {
175                         set_emin (emin);
176                         set_emax (emax);
177                       }
178                     if (mpfr_cmp (t, z))
179                       {
180                         printf ("results differ for n = %lu, prec = %u,"
181                                 " %s%s\n", n, prec,
182                                 mpfr_print_rnd_mode ((mpfr_rnd_t) rnd),
183                                 i ? ", reduced exponent range" : "");
184                         printf ("  got      ");
185                         mpfr_dump (z);
186                         printf ("  expected ");
187                         mpfr_dump (t);
188                         printf ("  approx   ");
189                         mpfr_dump (y);
190                         exit (1);
191                       }
192                   }
193               }
194           }
195     }
196 
197  clear_and_exit:
198   mpfr_clear (x);
199   mpfr_clear (y);
200   mpfr_clear (z);
201   mpfr_clear (t);
202 
203   tests_end_mpfr ();
204   return 0;
205 }
206