1/* Test file for mpfr_nan_p, mpfr_inf_p, mpfr_number_p, mpfr_zero_p and 2 mpfr_regular_p. 3 4Copyright 2001-2004, 2006-2023 Free Software Foundation, Inc. 5Contributed by the AriC and Caramba projects, INRIA. 6 7This file is part of the GNU MPFR Library. 8 9The GNU MPFR Library is free software; you can redistribute it and/or modify 10it under the terms of the GNU Lesser General Public License as published by 11the Free Software Foundation; either version 3 of the License, or (at your 12option) any later version. 13 14The GNU MPFR Library is distributed in the hope that it will be useful, but 15WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17License for more details. 18 19You should have received a copy of the GNU Lesser General Public License 20along with the GNU MPFR Library; see the file COPYING.LESSER. If not, see 21https://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., 2251 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ 23 24#include "mpfr-test.h" 25 26int 27main (void) 28{ 29 mpfr_t x; 30 int i = 0, j = 0; 31 32 /* We need to check that when the function is implemented by a macro, 33 it behaves correctly. */ 34#define ARG (i++, VOIDP_CAST(x)) 35#define CHECK MPFR_ASSERTN (i == ++j) 36 37 tests_start_mpfr (); 38 39 mpfr_init (x); 40 41#if 0 42 /* The following should yield a compilation error when the functions 43 are implemented as macros. Change 0 to 1 above in order to test. */ 44 (void) (mpfr_nan_p (1L)); 45 (void) (mpfr_inf_p (1L)); 46 (void) (mpfr_number_p (1L)); 47 (void) (mpfr_zero_p (1L)); 48 (void) (mpfr_regular_p (1L)); 49#endif 50 51#ifdef IGNORE_CPP_COMPAT 52#pragma GCC diagnostic push 53#pragma GCC diagnostic ignored "-Wc++-compat" 54#endif 55 56 /* check +infinity gives non-zero for mpfr_inf_p only */ 57 mpfr_set_ui (x, 1L, MPFR_RNDZ); 58 mpfr_div_ui (x, x, 0L, MPFR_RNDZ); 59 if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG)) 60 { 61 printf ("Error: mpfr_nan_p(+Inf) gives non-zero\n"); 62 exit (1); 63 } 64 CHECK; 65 if (!mpfr_inf_p (x) || !(mpfr_inf_p) (x) || !mpfr_inf_p (ARG)) 66 { 67 printf ("Error: mpfr_inf_p(+Inf) gives zero\n"); 68 exit (1); 69 } 70 CHECK; 71 if (mpfr_number_p (x) || (mpfr_number_p) (x) || mpfr_number_p (ARG)) 72 { 73 printf ("Error: mpfr_number_p(+Inf) gives non-zero\n"); 74 exit (1); 75 } 76 CHECK; 77 if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG)) 78 { 79 printf ("Error: mpfr_zero_p(+Inf) gives non-zero\n"); 80 exit (1); 81 } 82 CHECK; 83 if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG)) 84 { 85 printf ("Error: mpfr_regular_p(+Inf) gives non-zero\n"); 86 exit (1); 87 } 88 CHECK; 89 90 /* same for -Inf */ 91 mpfr_neg (x, x, MPFR_RNDN); 92 if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG)) 93 { 94 printf ("Error: mpfr_nan_p(-Inf) gives non-zero\n"); 95 exit (1); 96 } 97 CHECK; 98 if (!mpfr_inf_p (x) || !(mpfr_inf_p) (x) || !mpfr_inf_p (ARG)) 99 { 100 printf ("Error: mpfr_inf_p(-Inf) gives zero\n"); 101 exit (1); 102 } 103 CHECK; 104 if (mpfr_number_p (x) || (mpfr_number_p) (x) || mpfr_number_p (ARG)) 105 { 106 printf ("Error: mpfr_number_p(-Inf) gives non-zero\n"); 107 exit (1); 108 } 109 CHECK; 110 if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG)) 111 { 112 printf ("Error: mpfr_zero_p(-Inf) gives non-zero\n"); 113 exit (1); 114 } 115 CHECK; 116 if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG)) 117 { 118 printf ("Error: mpfr_regular_p(-Inf) gives non-zero\n"); 119 exit (1); 120 } 121 CHECK; 122 123 /* same for NaN */ 124 mpfr_sub (x, x, x, MPFR_RNDN); 125 if (!mpfr_nan_p (x) || !(mpfr_nan_p) (x) || !mpfr_nan_p (ARG)) 126 { 127 printf ("Error: mpfr_nan_p(NaN) gives zero\n"); 128 exit (1); 129 } 130 CHECK; 131 if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG)) 132 { 133 printf ("Error: mpfr_inf_p(NaN) gives non-zero\n"); 134 exit (1); 135 } 136 CHECK; 137 if (mpfr_number_p (x) || (mpfr_number_p) (x) || mpfr_number_p (ARG)) 138 { 139 printf ("Error: mpfr_number_p(NaN) gives non-zero\n"); 140 exit (1); 141 } 142 CHECK; 143 if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG)) 144 { 145 printf ("Error: mpfr_number_p(NaN) gives non-zero\n"); 146 exit (1); 147 } 148 CHECK; 149 if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG)) 150 { 151 printf ("Error: mpfr_regular_p(NaN) gives non-zero\n"); 152 exit (1); 153 } 154 CHECK; 155 156 /* same for a regular number */ 157 mpfr_set_ui (x, 1, MPFR_RNDN); 158 if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG)) 159 { 160 printf ("Error: mpfr_nan_p(1) gives non-zero\n"); 161 exit (1); 162 } 163 CHECK; 164 if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG)) 165 { 166 printf ("Error: mpfr_inf_p(1) gives non-zero\n"); 167 exit (1); 168 } 169 CHECK; 170 if (!mpfr_number_p (x) || !(mpfr_number_p) (x) || !mpfr_number_p (ARG)) 171 { 172 printf ("Error: mpfr_number_p(1) gives zero\n"); 173 exit (1); 174 } 175 CHECK; 176 if (mpfr_zero_p (x) || (mpfr_zero_p) (x) || mpfr_zero_p (ARG)) 177 { 178 printf ("Error: mpfr_zero_p(1) gives non-zero\n"); 179 exit (1); 180 } 181 CHECK; 182 if (!mpfr_regular_p (x) || !(mpfr_regular_p) (x) || !mpfr_regular_p (ARG)) 183 { 184 printf ("Error: mpfr_regular_p(1) gives zero\n"); 185 exit (1); 186 } 187 CHECK; 188 189 /* Same for +0 */ 190 mpfr_set_ui (x, 0, MPFR_RNDN); 191 if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG)) 192 { 193 printf ("Error: mpfr_nan_p(+0) gives non-zero\n"); 194 exit (1); 195 } 196 CHECK; 197 if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG)) 198 { 199 printf ("Error: mpfr_inf_p(+0) gives non-zero\n"); 200 exit (1); 201 } 202 CHECK; 203 if (!mpfr_number_p (x) || !(mpfr_number_p) (x) || !mpfr_number_p (ARG)) 204 { 205 printf ("Error: mpfr_number_p(+0) gives zero\n"); 206 exit (1); 207 } 208 CHECK; 209 if (!mpfr_zero_p (x) || !(mpfr_zero_p) (x) || !mpfr_zero_p (ARG)) 210 { 211 printf ("Error: mpfr_zero_p(+0) gives zero\n"); 212 exit (1); 213 } 214 CHECK; 215 if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG)) 216 { 217 printf ("Error: mpfr_regular_p(+0) gives non-zero\n"); 218 exit (1); 219 } 220 CHECK; 221 222 /* Same for -0 */ 223 mpfr_set_ui (x, 0, MPFR_RNDN); 224 mpfr_neg (x, x, MPFR_RNDN); 225 if (mpfr_nan_p (x) || (mpfr_nan_p) (x) || mpfr_nan_p (ARG)) 226 { 227 printf ("Error: mpfr_nan_p(-0) gives non-zero\n"); 228 exit (1); 229 } 230 CHECK; 231 if (mpfr_inf_p (x) || (mpfr_inf_p) (x) || mpfr_inf_p (ARG)) 232 { 233 printf ("Error: mpfr_inf_p(-0) gives non-zero\n"); 234 exit (1); 235 } 236 CHECK; 237 if (!mpfr_number_p (x) || !(mpfr_number_p) (x) || !mpfr_number_p (ARG)) 238 { 239 printf ("Error: mpfr_number_p(-0) gives zero\n"); 240 exit (1); 241 } 242 CHECK; 243 if (!mpfr_zero_p (x) || !(mpfr_zero_p) (x) || !mpfr_zero_p (ARG)) 244 { 245 printf ("Error: mpfr_zero_p(-0) gives zero\n"); 246 exit (1); 247 } 248 CHECK; 249 if (mpfr_regular_p (x) || (mpfr_regular_p) (x) || mpfr_regular_p (ARG)) 250 { 251 printf ("Error: mpfr_regular_p(-0) gives non-zero\n"); 252 exit (1); 253 } 254 CHECK; 255 256#ifdef IGNORE_CPP_COMPAT 257#pragma GCC diagnostic pop 258#endif 259 260 mpfr_clear (x); 261 262 tests_end_mpfr (); 263 return 0; 264} 265