CppUnit project page | FAQ | CppUnit home page

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

FloatingPoint.h
Go to the documentation of this file.
1 #ifndef CPPUNIT_PORTABILITY_FLOATINGPOINT_H_INCLUDED
2 #define CPPUNIT_PORTABILITY_FLOATINGPOINT_H_INCLUDED
3
4 #include <cppunit/Portability.h>
5 #include <math.h>
6
7 CPPUNIT_NS_BEGIN
8
10 // According to IEEE-754 floating point standard,
11 // (see e.g. page 8 of
12 // http://www.cs.berkeley.edu/~wkahan/ieee754status/ieee754.ps)
13 // all comparisons with NaN are false except "x != x", which is true.
14 //
15 // At least Microsoft Visual Studio 6 is known not to implement this test correctly.
16 // It emits the following code to test equality:
17 // fcomp qword ptr [nan]
18 // fnstsw ax // copie fp (floating-point) status register to ax
19 // test ah,40h // test bit 14 of ax (0x4000) => C3 of fp status register
20 // According to the following documentation on the x86 floating point status register,
21 // the C2 bit should be tested to test for NaN value.
22 // http://webster.cs.ucr.edu/AoA/Windows/HTML/RealArithmetic.html#1000117
23 // In Microsoft Visual Studio 2003 & 2005, the test is implemented with:
24 // test ah,44h // Visual Studio 2005 test both C2 & C3...
25 //
26 // To work around this, a NaN is assumed to be detected if no strict ordering is found.
27 inline bool floatingPointIsUnordered( double x )
28 {
29 // x != x will detect a NaN on conformant platform
30 // (2.0 < x && x < 1.0) will detect a NaN on non conformant platform:
31 // => no ordering can be found for x.
32 return (x != x) || (2.0 < x && x < 1.0);
33 }
34
35
38 inline int floatingPointIsFinite( double x )
39 {
40 #if defined(CPPUNIT_HAVE_ISFINITE)
41 return isfinite( x );
42 #elif defined(CPPUNIT_HAVE_FINITE)
43 return finite( x );
44 #elif defined(CPPUNIT_HAVE__FINITE)
45 return _finite(x);
46 #else
47 double testInf = x * 0.0; // Produce 0.0 if x is finite, a NaN otherwise.
48 return testInf == 0.0 && !floatingPointIsUnordered(testInf);
49 #endif
50 }
51
52 CPPUNIT_NS_END
53
54 #endif // CPPUNIT_PORTABILITY_FLOATINGPOINT_H_INCLUDED
Portability.h
floatingPointIsUnordered
CPPUNIT_NS_BEGIN bool floatingPointIsUnordered(double x)
Tests if a floating-point is a NaN.
Definition: FloatingPoint.h:27
floatingPointIsFinite
int floatingPointIsFinite(double x)
Tests if a floating-point is finite.
Definition: FloatingPoint.h:38
CPPUNIT_NS_END
#define CPPUNIT_NS_END
Definition: Portability.h:120
CPPUNIT_NS_BEGIN
#define CPPUNIT_NS_BEGIN
Definition: Portability.h:119

| hosts this site. |  | Send comments to: CppUnit Developers