usleep tests: Avoid failure due to known Cygwin 3.5.3 bug.
[gnulib.git] / tests / test-isfinite.c
blobad8cc2162ec1f13cecd9b339622e1ed87a73301f
1 /* Test of isfinite() substitute.
2 Copyright (C) 2007-2024 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation, either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <https://www.gnu.org/licenses/>. */
17 /* Written by Ben Pfaff, 2007, using Bruno Haible's code as a
18 template. */
20 #include <config.h>
22 #include <math.h>
24 /* isfinite must be a macro. */
25 #ifndef isfinite
26 # error missing declaration
27 #endif
29 #include <float.h>
30 #include <limits.h>
32 #include "infinity.h"
33 #include "snan.h"
34 #include "macros.h"
36 float zerof = 0.0f;
37 double zerod = 0.0;
38 long double zerol = 0.0L;
40 static void
41 test_isfinitef ()
43 /* Zero. */
44 ASSERT (isfinite (0.0f));
45 /* Subnormal values. */
46 ASSERT (isfinite (FLT_MIN / 2));
47 ASSERT (isfinite (-FLT_MIN / 2));
48 /* Finite values. */
49 ASSERT (isfinite (3.141f));
50 ASSERT (isfinite (3.141e30f));
51 ASSERT (isfinite (3.141e-30f));
52 ASSERT (isfinite (-2.718f));
53 ASSERT (isfinite (-2.718e30f));
54 ASSERT (isfinite (-2.718e-30f));
55 /* Infinite values. */
56 ASSERT (!isfinite (Infinityf ()));
57 ASSERT (!isfinite (- Infinityf ()));
58 /* Quiet NaN. */
59 ASSERT (!isfinite (zerof / zerof));
60 #if HAVE_SNANF
61 /* Signalling NaN. */
62 ASSERT (!isfinite (SNaNf ()));
63 #endif
66 static void
67 test_isfinited ()
69 /* Zero. */
70 ASSERT (isfinite (0.0));
71 /* Subnormal values. */
72 ASSERT (isfinite (DBL_MIN / 2));
73 ASSERT (isfinite (-DBL_MIN / 2));
74 /* Finite values. */
75 ASSERT (isfinite (3.141));
76 ASSERT (isfinite (3.141e30));
77 ASSERT (isfinite (3.141e-30));
78 ASSERT (isfinite (-2.718));
79 ASSERT (isfinite (-2.718e30));
80 ASSERT (isfinite (-2.718e-30));
81 /* Infinite values. */
82 ASSERT (!isfinite (Infinityd ()));
83 ASSERT (!isfinite (- Infinityd ()));
84 /* Quiet NaN. */
85 ASSERT (!isfinite (zerod / zerod));
86 #if HAVE_SNAND
87 /* Signalling NaN. */
88 ASSERT (!isfinite (SNaNd ()));
89 #endif
92 static void
93 test_isfinitel ()
95 /* Zero. */
96 ASSERT (isfinite (0.0L));
97 /* Subnormal values. */
98 ASSERT (isfinite (LDBL_MIN / 2));
99 ASSERT (isfinite (-LDBL_MIN / 2));
100 /* Finite values. */
101 ASSERT (isfinite (3.141L));
102 ASSERT (isfinite (3.141e30L));
103 ASSERT (isfinite (3.141e-30L));
104 ASSERT (isfinite (-2.718L));
105 ASSERT (isfinite (-2.718e30L));
106 ASSERT (isfinite (-2.718e-30L));
107 /* Infinite values. */
108 ASSERT (!isfinite (Infinityl ()));
109 ASSERT (!isfinite (- Infinityl ()));
110 /* Quiet NaN. */
111 ASSERT (!isfinite (zerol / zerol));
112 #if HAVE_SNANL
113 /* Signalling NaN. */
114 ASSERT (!isfinite (SNaNl ()));
115 #endif
117 #if ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
118 #define NWORDS \
119 ((sizeof (long double) + sizeof (unsigned int) - 1) / sizeof (unsigned int))
120 typedef union { unsigned int word[NWORDS]; long double value; }
121 memory_long_double;
122 /* Representation of an 80-bit 'long double' as an initializer for a sequence
123 of 'unsigned int' words. */
124 # ifdef WORDS_BIGENDIAN
125 # define LDBL80_WORDS(exponent,manthi,mantlo) \
126 { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
127 ((unsigned int) (manthi) << 16) | ((unsigned int) (mantlo) >> 16), \
128 (unsigned int) (mantlo) << 16 \
130 # else
131 # define LDBL80_WORDS(exponent,manthi,mantlo) \
132 { mantlo, manthi, exponent }
133 # endif
134 { /* Quiet NaN. */
135 static memory_long_double x =
136 { .word = LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
137 ASSERT (!isfinite (x.value));
140 /* Signalling NaN. */
141 static memory_long_double x =
142 { .word = LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
143 ASSERT (!isfinite (x.value));
145 /* isfinite should return something for noncanonical values. */
146 { /* Pseudo-NaN. */
147 static memory_long_double x =
148 { .word = LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
149 ASSERT (isfinite (x.value) || !isfinite (x.value));
151 { /* Pseudo-Infinity. */
152 static memory_long_double x =
153 { .word = LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
154 ASSERT (isfinite (x.value) || !isfinite (x.value));
156 { /* Pseudo-Zero. */
157 static memory_long_double x =
158 { .word = LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
159 ASSERT (isfinite (x.value) || !isfinite (x.value));
161 { /* Unnormalized number. */
162 static memory_long_double x =
163 { .word = LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
164 ASSERT (isfinite (x.value) || !isfinite (x.value));
166 { /* Pseudo-Denormal. */
167 static memory_long_double x =
168 { .word = LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
169 ASSERT (isfinite (x.value) || !isfinite (x.value));
171 #undef NWORDS
172 #endif
176 main ()
178 test_isfinitef ();
179 test_isfinited ();
180 test_isfinitel ();
181 return test_exit_status;