ZY.Zhou wrote:
Andrei Alexandrescu Wrote:
Sorry. So a !>= b is indeed semantically equivalent with isnan(a) ||
isnan(b) || a < b. However, if I read the table at
http://www.digitalmars.com/d/2.0/expression.html#RelExpression
correctly, !(a >= b) would throw if either is NaN.
But there is a note under that table:
"Exception" means the Invalid Exception is raised if one of the
operands is a NAN. It does not mean an exception is thrown.
Invalid Exception can be checked using the functions in std.c.fenv.
If a or b is signalling NaN (uninitialized variable), and invalid
exceptions are unmasked, then a!>=b will generate a hardware exception
-- showing you that you used an uninitialized variable.
isnan(a) || isnan(b) || a < b
will not raise the hardware exception.
So I don't feel any difference between !(a>=b) and a!>=b
... but !(a>=b) will.
There's no difference between !(a>=b) and a!>=b.
Here's a table of equivalences.
a!<>=b (a!=a) || (b!=b)
a<>b (a==a) && (b==b) && (a!=b)
a!<>b (a!=a) || (b!=b) || (a!=b)
a<>=b (a==a) && (b==b)
a!<=b !(a<=b)
a!<b !(a<b)
a!>=b !(a>=b)
a!>b !(a>b)
a!>=b !(a>=b)
Obviously if a or b is known at compile time, or if it is known not to
be NaN, many of the <> clauses can be dropped.