Don wrote:
dsimcha wrote:
== Quote from Andrei Alexandrescu (seewebsiteforem...@erdani.org)'s article
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

I personally would like to see the whole NaNs not having a defined ordering thing done away with entirely. This probably won't happen b/c it's (I would guess) in the IEEE standard. However, the fact that a NaN is not less than, equal to, or greater than, anything creates an extremely annoying special case when doing generic programming for anything that requires a total ordering, such as trees and
sorting.

Agreed. It's quite ridiculous that x==x fails for some values of x (namely NaN). On this NG, I've mentioned the rationale for why that is (eg, if NaN==NaN, then sqrt(-4) == sqrt(-9)). But unfortunately, in solving an obscure corner case, the IEEE standard destroyed one of the most basic axioms in mathematics. It's one of those things that Seemed Like A Good Idea At The Time. The cure is a millions times worse than the disease. But it's in hardware, so it's Too Late Now.

Yah, there was a discussion on the C++ standardization mailing list too. It turns out that x == x is a pretty fundamental concept and if a type as common as float breaks it with panache, then it's pretty complicated to change language fundaments to account for such a case.

Andrei

Reply via email to