The *immediate* cause for the IEEE switch has now actually been retracted,
so we could still backpedal in VMS, but it's good that we are having
this discussion.
Let me elaborate how this came to be.
(1) The Math::BigInt author added a test for the equality of
"Perl infinity" (that is, native floating point's view
of infinity) and "Math::BigInt infinity" (that is, a Perl
object).
How to generate a "Perl infinity?" Well, there's really
no Officially Blessed Way. The closest imitation is to
try creating a Really Big Number.
So the new test did the moral equivalent of the following:
$x = Math::BigInt->new(...); # whatever it was to create an infinity
$y = 1e1000000;
print "ok\n" if $x == $y;
The problem was that in a couple of platforms (VMS, Tru64,
and Cray T90) the 1e1000000 blew up during compilation phase
(the assignment didn't even get to happen). Blew up: floating
point exception.
Now, you may be trying 1e1000000 in your VMS Perls and wondering
that hey, this doesn't blow up, it just gives me a big number.
And you are right: the blowing up happened only in the latest
developer snapshots of Perl.
(2) Why are the latest developer snapshots blowing up?
Because we stopped using vendors' string -> number conversion
routines (they tend to have subtle bugs) ) and instead wrote one
ourselves.
The new float-as-a-string -> float routine does multiplications,
and once you are converting the string "1e1000000", eventually
you are multiplying a HUGE_VAL with a HUGE_VAL, which promptly
gives a floating point exception-- unless you are using the
IEEE semantics, for which the default is to clamp at infinity.
(One can *ask for* an exception to be delivered.)
Summary: since the immediate failure has been removed, we could still
switch back to not defaulting to IEEE floats. We could special case
VMS in the conversion routine-- and actually, we already had code like
that in place, courtesy of Peter Prymmer and Craig Berry. The special
cased code had special code that jumped out of the loop just before
the floating point conversion routine would have been incited to throw
an exception (this is, very likely, exactly what the native
implementation of the same conversion does in VMS). I just removed
the workaround code for now to get a "better view" of the code, and
maybe get some test results from various platforms.
--
$jhi++; # http://www.iki.fi/jhi/
# There is this special biologist word we use for 'stable'.
# It is 'dead'. -- Jack Cohen