Denis Koroskin wrote:
On Sun, 17 May 2009 21:14:46 +0400, Andrei Alexandrescu 
<[email protected]> wrote:

Hello,


I think the floating-point operators:

   a !<>= b
   a !<> b
   a <> b
   a <>= b
   a !> b
   a !>= b
   a !< b
   a !<= b

are useless. A simple peephole optimization in the compiler can automatically rewrite NaN test followed by regular operations into the operations above, for example:

isNaN(a) || isNan(b) || a >= b

is the same as

a !< b

This is in keeping with what the compiler does when seeing code like:

a = x / y;
b = x % y;

There's a peephole optimization that groups the / and the % together into an assembler operation that does both. If this is the way to go, we better be congruent and use explicit isNaN tests (that are then optimized) instead of defining eight extra operators.


Andrei

Does anyone other than Don uses them at all?
I don't care if they are removed from D.

Sad to say, I mostly only use !<>=, and that's because it's defined in the language so that it works at compile time (and is unaffected by the Tango/Phobos incompatibility problem). Also x!=x works just as well as an isNaN test.

The silly thing is, in asm, I would never use the equivalent comparison. In x86, for instance, a floating point < compare sets TWO flags; one for less, one for NaN. You almost always want to treat NaN specially, so you do one compare and two branches. The NCEG operators only really allow you to move all of the special cases into a single test, but you end up doing a second comparison anyway, so it doesn't really buy you very much at all.

Inclusion of the NCEG operators was a bit of tokenism, making a _very_ strong statement that D took numerical programmers seriously. But I think D's at the point where it can make that statement without relying on tokenism.

Don.

Reply via email to