Reputation: 31
in c++ for two doubles a and b, is it true if a > b, then a - b > 0? Assume a, b are not Nan, just normal numbers
Upvotes: 3
Views: 176
Reputation: 30497
Yes, this is true in IEEE-754 arithmetic, in all rounding modes. So long as your C++ compiler uses IEEE-754 semantics (either via software or hardware). But see Eric Postpischill's answer for when particular implementations might diverge from IEEE-754. Best to check with your compiler documentation.
Upvotes: 1
Reputation: 224596
No, not by the requirements of the C++ standard alone. C++ allows implementations to use floating-point types without support for subnormal numbers. In such a type, you could have a
equal to 1.00012•2m, where m is the minimum normal exponent, and b
equal to 1.00002•2m. Then a > b
but the exact value of a-b
is not representable (it would be subnormal), so the computed result is zero.
This does not happen with IEEE-754 arithmetic, which supports subnormals. However, some C++ implementations, possibly not conforming to the C++ standard, use IEEE-754 formats but flush subnormal results to zero. So this will also produce a > b
but a-b == 0
.
Supposing an implementation is supporting subnormals and is conforming to the C standard, another issue is the standard allows implementations to use extra precision within floating-point expressions. If your a
and b
are actually expressions rather than single objects, it is possible that the extra precision could cause a > b
to be true while a-b == 0
is false. Implementations are permitted to use or not use such extra precision at will, so a > b
could be true in some evaluations and not others, and similarly for a-b == 0
. If a
and b
are single objects, this will not happen, because the standard requires implementations to “discard” the excess precision in assignments and casts.
Upvotes: 7