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.

Reply via email to