In the latest C++ standard, I noticed the following macros :
bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, fl
isgreater
et al. were incorporated into C++11 from C99. They are defined to not raise the invalid floating-point exception when x
and/or y
are signalling NaN
values.
The rationale given is:
This macro is a quiet (non-floating-point exception raising) version of a relational operator. It facilitates writing efficient code that accounts for NaNs without suffering the invalid floating-point exception.
The numeric value of the macro on NaN
is the same as always; NaN
values compare false to all other values including NaN
values under all relational operators and the new macros.
Unlike the relational operators, these macros do really only return a boolean value and do never raise any floating point exception.
In short: You only have to deal with true
/false
and nothing else.
references:
The Open Group descriptions (not the C or C++ standard, but highly relevant in the Unix/Linux world and almost always similar to the standards):
C++ standard:
C Library [c.math]:
The classification/comparison functions behave the same as the C macros with the corresponding names defined in 7.12.3, Classification macros, and 7.12.14, Comparison macros in the C Standard. Each function is overloaded for the three floating-point types, as follows [...]
C standard:
7.12.14 Comparison macros
[...] For any ordered pair of numeric values exactly one of the relationships — less, greater, and equal — is true. Relational operators may raise the ‘‘invalid’’ floating-point exception when argument values are NaNs. For a NaN and a numeric value, or for two NaNs, just the unordered relationship is true. The following subclauses provide macros that are quiet (non floating-point exception raising) versions of the relational operators, and other comparison macros that facilitate writing efficient code that accounts for NaNs without suffering the ‘‘invalid’’ floating-point exception. In the synopses in this subclause, real-floating indicates that the argument shall be an expression of real floating type.