-----Original Message-----
From: Zoffix Znet via RT
Sent: Wednesday, October 11, 2017 11:09 PM
To: sisyph...@optusnet.com.au
Subject: [perl #132268] Floating point anomalies
What you describe looks to be similar to the other issue I have in my
private bug stash:
say .1e0 + .2e0 == .3e0; # False
say 1.0e-1 + 2.0e-1 == 3.0e-1; # True;
And a brief look into guts suggests it's to do with the way our Nums are
constructed during parsing. I was able to repro the issue with the C
version of what we do in our Grammar: https://glot.io/snippets/eufyogt02g
Yes, the anomaly with those particular values lies in the assignment of .3e0
versus the assignment of 3.0e-1.
Looks like it's the difference between calculating 3 * 0.1 and 30 * 0.01:
$ perl -le 'print scalar reverse unpack "h*", pack "d<", 3 * 0.1;'
3fd3333333333334
$ perl -le 'print scalar reverse unpack "h*", pack "d<", 30 * 0.01;'
3fd3333333333333
At least, the calculation of 3.0e-1 produces produces the first value (which
is overstated by one ULP), and the calculation of 0.3e0 produces the second
(which is correct).
So yeah, the plan is to eventually address these.
That's good news.
If you spot any more inconsistencies and weirdness, please report them.
Perl6's printf() function looks a little suspect - though I might be missing
something here.
As with perl5's say function, doubles are rounded to 14 decimal digits of
precision, so we get:
$ perl6 -e 'say 1.000000000000001e0;'
1
$ perl -E 'say 1.000000000000001e0;'
1
On perl5 we can get to see a more accurate rendition of the base 10 value
using printf():
$ perl -e 'printf "%.16e\n", 1.000000000000001e0;'
1.0000000000000011e+000
But that doesn't work on perl6:
$ perl6 -e 'printf "%.16e\n", 1.000000000000001e0;'
1.0000000000000000e+00
Is there something amiss here ?
Cheers,
Rob