Ne.app NeANT
The Ne.app NeANT User module of the NeANT distribution.
fpclass.h
Go to the documentation of this file.
1
30#ifndef _RWSTD_FPCLASS_H_INCLUDED
31#define _RWSTD_FPCLASS_H_INCLUDED
32
33#include <rw/_defs.h>
34
35#include <float.h> // for _finite(), _fpclass(), _isnan(), _copysign()
36#include <math.h> // for isfinite(), isnan(), isinf(), signbit()
37
38#ifdef _RWSTD_FORCE_IEEEFP_H
39# include <ieeefp.h> // for fpclass(), isnan()
40#endif // _RWSTD_FORCE_IEEEFP_H
41
42
43#if defined (_MSC_VER)
44
45
46inline bool
47__rw_isfinite (double val)
48{
49 return !!_finite (val);
50}
51
52
53inline bool
54__rw_signbit (double val)
55{
56 return 0 > _copysign (1., val);
57}
58
59
60inline bool
61__rw_isinf (double val)
62{
63 const int fpc = _fpclass (val);
64
65 if (_FPCLASS_NINF == fpc) {
66 // verify that __rw_signbit() correctly determines
67 // the sign of negative infinity
69 return true;
70 }
71 else if (_FPCLASS_PINF == fpc) {
72 // verify that __rw_signbit() correctly determines
73 // the sign of positive infinity
75 return true;
76 }
77
78 return false;
79}
80
81
82inline bool
83__rw_isnan (double val)
84{
85 return !!_isnan (val);
86}
87
88
89inline bool __rw_isqnan (double val)
90{
91 return _FPCLASS_QNAN == _fpclass (val);
92}
93
94
95inline bool __rw_issnan (double val)
96{
97 return _FPCLASS_SNAN == _fpclass (val);
98}
99
100
101#elif defined (_RWSTD_OS_SUNOS)
102
103inline bool
104__rw_isfinite (double val)
105{
106 return !!finite (val);
107}
108
109
110inline bool
111__rw_signbit (double val)
112{
113 // implement own signbit() to avoid dragging in libm or libsunmath
114 return _RWSTD_REINTERPRET_CAST (const _RWSTD_UINT64_T&, val) >> 63;
115}
116
117
118inline bool
119__rw_isinf (double val)
120{
121 const int fpc = fpclass (val);
122
123 if (FP_NINF == fpc) {
124 // verify that __rw_signbit() correctly determines
125 // the sign of negative infinity
127 return true;
128 }
129 else if (FP_PINF == fpc) {
130 // verify that __rw_signbit() correctly determines
131 // the sign of positive infinity
133 return true;
134 }
135
136 return false;
137}
138
139
140inline bool
141__rw_isnan (double val)
142{
143 return 0 != isnan (val);
144}
145
146
147inline bool
148__rw_isqnan (double val)
149{
150 return FP_QNAN == fpclass (val);
151}
152
153
154inline bool
155__rw_issnan (double val)
156{
157 return FP_SNAN == fpclass (val);
158}
159
160
161#elif defined (fpclassify)
162
163
164inline bool
165__rw_isfinite (double val)
166{
167 return !!isfinite (val);
168}
169
170
171inline bool
172__rw_signbit (double val)
173{
174 return !!signbit (val);
175}
176
177
178inline bool
179__rw_isinf (double val)
180{
181 return !!isinf (val);
182}
183
184
185inline bool
186__rw_isnan (double val)
187{
188 return !!isnan (val);
189}
190
191
192inline bool
193__rw_isqnan (double)
194{
195 return false;
196}
197
198
199inline bool
200__rw_issnan (double)
201{
202 return false;
203}
204
205#else
206
207inline bool __rw_isfinite (double) { return true; }
208
209inline bool __rw_signbit (double) { return false; }
210
211inline bool __rw_isinf (double) { return false; }
212
213inline bool __rw_isnan (double) { return false; }
214
215inline bool __rw_isqnan (double) { return false; }
216
217inline bool __rw_issnan (double) { return false; }
218
219#endif
220
221
222inline bool __rw_isfinite (float) { return true; }
223
224inline bool __rw_signbit (float) { return false; }
225
226inline bool __rw_isinf (float) { return false; }
227
228inline bool __rw_isnan (float) { return false; }
229
230inline bool __rw_isqnan (float) { return false; }
231
232inline bool __rw_issnan (float) { return false; }
233
234
235#ifndef _RWSTD_NO_LONG_DOUBLE
236
237# if _RWSTD_DBL_SIZE == _RWSTD_LDBL_SIZE
238
239inline bool __rw_isfinite (long double x) { return __rw_isfinite (double (x)); }
240
241inline bool __rw_signbit (long double x) { return __rw_signbit (double (x)); }
242
243inline bool __rw_isinf (long double x) { return __rw_isinf (double (x)); }
244
245inline bool __rw_isnan (long double x) { return __rw_isnan (double (x)); }
246
247inline bool __rw_isqnan (long double x) { return __rw_isqnan (double (x)); }
248
249inline bool __rw_issnan (long double x) { return __rw_issnan (double (x)); }
250
251# else // _RWSTD_DBL_SIZE != _RWSTD_LDBL_SIZE
252
253inline bool __rw_isfinite (long double) { return true; }
254
255inline bool __rw_signbit (long double) { return false; }
256
257inline bool __rw_isinf (long double) { return false; }
258
259inline bool __rw_isnan (long double) { return false; }
260
261inline bool __rw_isqnan (long double) { return false; }
262
263inline bool __rw_issnan (long double) { return false; }
264
265# endif // _RWSTD_DBL_SIZE == _RWSTD_LDBL_SIZE
266
267#endif // _RWSTD_NO_LONG_DOUBLE
268
269
270#endif // _RWSTD_FPCLASS_H_INCLUDED
#define x
Definition 17.names.cpp:140
#define val
Definition 17.names.cpp:570
#define _RWSTD_REINTERPRET_CAST(T, x)
Definition _defs.h:535
#define _RWSTD_ASSERT(ignore)
Definition _defs.h:1108
bool __rw_isfinite(double)
Definition fpclass.h:207
bool __rw_isinf(double)
Definition fpclass.h:211
bool __rw_signbit(double)
Definition fpclass.h:209
bool __rw_isqnan(double)
Definition fpclass.h:215
bool __rw_issnan(double)
Definition fpclass.h:217
bool __rw_isnan(double)
Definition fpclass.h:213