From: Brandon Allbery
Sent: Friday, October 13, 2017 4:15 AM
To: sisyph...@optusnet.com.au
Cc: Carl Mäsak via RT
Subject: Re: [perl #132268] Floating point anomalies
On Thu, Oct 12, 2017 at 5:31 AM, <sisyph...@optusnet.com.au> wrote:
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
To correct that assertion, they both of course round to 15 decimal digits of
precision.
I question your use of 'accurate'. The low bits are *never* accurate.
They're trying to be more 'precise', but the value they have will depend
strongly on how exactly the value was calculated, and there are entirely
reasonable design decisions that can cause them to differ between
implementations.
I don't think there's anything "reasonable" about a printf() implementation
that tells me:
$ perl6 -e 'printf "%.16e\n", Num(sqrt(3e0));'
1.7320508075688800e+00
Perl6 knows quite well that a double assigned a value of
1.7320508075688800e+00 is not equivalent to the double returned by
Num(sqrt(3e0)) :
$ perl6 -e 'say "not equivalent" if 1.7320508075688800e0 != Num(sqrt(3e0));'
not equivalent
Furthermore, perl6 also knows quite well that a double assigned the value
1.7320508075688772e+00 *is* equivalent to the double returned by
Num(sqrt(3e0)):
$ perl6 -e 'say "ok" if 1.7320508075688772e0 == Num(sqrt(3e0));'
ok
It's bad enough that perl5 and perl6 round to 15 decimal digits of
precision, but at least perl5's printf will give me 17 decimal digits when I
ask it to (and I think perl6 should do the same):
$ perl -e 'printf "%.16e\n", sqrt(3.0);'
1.7320508075688772e+00
As a feature request, it would also be nice to see "%a" formatting
implemented as that then provides one with the means to see the exact value
of the given double.
Cheers,
Rob