xref: /netbsd-src/external/lgpl3/mpfr/dist/tests/tdot.c (revision 32d1c65c71fbdb65a012e8392a62a757dd6853e9)
1 /* tdot -- test file for mpfr_dot
2 
3 Copyright 2018-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 static void
26 check_simple (void)
27 {
28   mpfr_t tab[3], r;
29   mpfr_ptr tabp[3];
30   int i;
31 
32   mpfr_init2 (r, 16);
33   for (i = 0; i < 3; i++)
34     {
35       mpfr_init2 (tab[i], 16);
36       mpfr_set_ui (tab[i], 1, MPFR_RNDN);
37       tabp[i] = tab[i];
38     }
39 
40   i = mpfr_dot (r, tabp, tabp, 3, MPFR_RNDN);
41   if (mpfr_cmp_ui0 (r, 3) || i != 0)
42     {
43       printf ("Error in check_simple\n");
44       exit (1);
45     }
46 
47   mpfr_clears (tab[0], tab[1], tab[2], r, (mpfr_ptr) 0);
48 }
49 
50 static void
51 check_special (void)
52 {
53   mpfr_t tab[3], r;
54   mpfr_ptr tabp[3];
55   int i;
56   int rnd;
57 
58   mpfr_inits2 (53, tab[0], tab[1], tab[2], r, (mpfr_ptr) 0);
59   tabp[0] = tab[0];
60   tabp[1] = tab[1];
61   tabp[2] = tab[2];
62 
63   RND_LOOP (rnd)
64     {
65       i = mpfr_dot (r, tabp, tabp, 0, (mpfr_rnd_t) rnd);
66       if (!MPFR_IS_ZERO (r) || !MPFR_IS_POS (r) || i != 0)
67         {
68           printf ("Special case n==0 failed for %s!\n",
69                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
70           exit (1);
71         }
72     }
73 
74   mpfr_set_ui (tab[0], 42, MPFR_RNDN);
75   RND_LOOP (rnd)
76     {
77       i = mpfr_dot (r, tabp, tabp, 1, (mpfr_rnd_t) rnd);
78       if (mpfr_cmp_ui0 (r, 42*42) || i != 0)
79         {
80           printf ("Special case n==1 failed for %s!\n",
81                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
82           exit (1);
83         }
84     }
85 
86   mpfr_set_ui (tab[1], 17, MPFR_RNDN);
87   MPFR_SET_NAN (tab[2]);
88   RND_LOOP (rnd)
89     {
90       i = mpfr_dot (r, tabp, tabp, 3, (mpfr_rnd_t) rnd);
91       if (!MPFR_IS_NAN (r) || i != 0)
92         {
93           printf ("Special case NAN failed for %s!\n",
94                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
95           exit (1);
96         }
97     }
98 
99   MPFR_SET_INF (tab[2]);
100   MPFR_SET_POS (tab[2]);
101   RND_LOOP (rnd)
102     {
103       i = mpfr_dot (r, tabp, tabp, 3, (mpfr_rnd_t) rnd);
104       if (!MPFR_IS_INF (r) || !MPFR_IS_POS (r) || i != 0)
105         {
106           printf ("Special case +INF failed for %s!\n",
107                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
108           exit (1);
109         }
110     }
111 
112   MPFR_SET_INF (tab[2]);
113   MPFR_SET_NEG (tab[2]);
114   RND_LOOP (rnd)
115     {
116       i = mpfr_dot (r, tabp, tabp, 3, (mpfr_rnd_t) rnd);
117       if (!MPFR_IS_INF (r) || !MPFR_IS_POS (r) || i != 0)
118         {
119           printf ("Special case +INF failed for %s!\n",
120                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
121           exit (1);
122         }
123     }
124 
125   MPFR_SET_ZERO (tab[1]);
126   RND_LOOP (rnd)
127     {
128       i = mpfr_dot (r, tabp, tabp, 2, (mpfr_rnd_t) rnd);
129       if (mpfr_cmp_ui0 (r, 42*42) || i != 0)
130         {
131           printf ("Special case 42+0 failed for %s!\n",
132                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
133           exit (1);
134         }
135     }
136 
137   MPFR_SET_NAN (tab[0]);
138   RND_LOOP (rnd)
139     {
140       i = mpfr_dot (r, tabp, tabp, 3, (mpfr_rnd_t) rnd);
141       if (!MPFR_IS_NAN (r) || i != 0)
142         {
143           printf ("Special case NAN+0+-INF failed for %s!\n",
144                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
145           exit (1);
146         }
147     }
148 
149   mpfr_set_inf (tab[0], 1);
150   mpfr_set_inf (tab[0], 1);
151   mpfr_set_inf (tab[2], -1);
152   RND_LOOP (rnd)
153     {
154       i = mpfr_dot (r, tabp, tabp + 1, 2, (mpfr_rnd_t) rnd);
155       if (!MPFR_IS_NAN (r) || i != 0)
156         {
157           printf ("Special case inf*inf-inf*inf failed for %s!\n",
158                   mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
159           exit (1);
160         }
161     }
162 
163   mpfr_clears (tab[0], tab[1], tab[2], r, (mpfr_ptr) 0);
164 }
165 
166 int
167 main (int argc, char *argv[])
168 {
169   tests_start_mpfr ();
170 
171   check_simple ();
172   check_special ();
173 
174   tests_end_mpfr ();
175 
176   return 0;
177 }
178