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