Floating point operations

Compares and unordered condition

In addition to the usual relationships between floating point values (less than, equal, greater than), there is a fourth relationship: unordered. The unordered case arises when at least one operand is a NaN. Every NaN compares unordered with any value, including itself.

The C compilation system provides the following predicates required by IEEE between floating point operands:

   ==      >=
   !=      <
   >       <=
While there is no predicate to test for unordered, you can use isnand() or isnanf() to test whether an argument is a NaN. For information on isnand() and isnanf(), see isnan(S).

The relations >, >=, <, and <= raise invalid operation for unordered operands. The compiler generated code does not guard against the unordered outcome of a comparison. If the trap is masked, the path taken for unordered conditions is the same as if the conditional were true, which may result in incorrect behavior.

For the predicates == and !=, unordered condition does not lead to invalid operation. The path taken for unordered condition is the same as when the operands are non-equal, which is correct.

(a > b) is not the same as ( !(a <= b) ) in IEEE floating point arithmetic. The difference occurs when b or a compares unordered. The C compiler generates the same code for both cases.


Next topic: NaNs and infinities in input/output
Previous topic: Square root

© 2003 Caldera International, Inc. All rights reserved.
SCO OpenServer Release 5.0.7 -- 11 February 2003