Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^2: Perl6 discoveries — floating-point

by Grimy (Pilgrim)
on Oct 18, 2017 at 14:13 UTC ( [id://1201595]=note: print w/replies, xml ) Need Help??


in reply to Re: Perl6 discoveries — floating-point
in thread Perl6 discoveries — floating-point

Thanks for your answer.

Python3, JavaScript, Ruby, Java (and probably others) don’t always output 17 decimal digits: they output as few digits as possible while still ensuring that parsing back the output yields the original number. This sounds like the smart thing to do.

I just found out that Python2 makes a similar, but much worse, mistake: it rounds at 12 digits! It’s good to see that Python3 fixed this particular wart; too bad Perl6 kept the weird Perl5 behavior, here.

I should’ve made it clearer that I was looking for explanations to all these things, not just the last one. What’s your take on the second-to-last example, where $a < $b, and yet Num($a) > Num($b)? (update: you updated your post while I was typing, and now it partly addresses this, yay!)

Replies are listed 'Best First'.
Re^3: Perl6 discoveries — floating-point
by syphilis (Archbishop) on Oct 19, 2017 at 00:41 UTC
    This sounds like the smart thing to do

    It's my preferred option, but there's a view that 17 digits is just too much clutter and only gives one a level of precision that one neither generally wants nor can comprehend.
    And I think that's how choices of 12 or 15 might have come about.
    So ... having print() output a "thereabouts" value is not universally condemned - given that one can always see the extra decimal digits by doing printf "%.16e", $double

    However, whenever I've tried to get the full 17 decimal digits by using perl6's printf() the last 2 digits are always "0" :
    C:\>perl6 -e "printf '%.16e\n', 1.7320508075688772e0;" 1.7320508075688800e+00
    (The perl6 developers have been recently informed of this.)

    What’s your take on the second-to-last example, where $a < $b, and yet Num($a) > Num($b)?


    I speculate that there's a bug in the conversion of rational values to doubles:
    C:\>perl6 -e "say Rat(0.7777777777777777777770) > Rat(0.77777777777777 +77777771);" False C:\>perl6 -e "say Num(Rat(0.7777777777777777777770)) > Num(Rat(0.77777 +77777777777777771));" True
    It is known that the way that perl6 assigns doubles can result in weird discrepancies and, given that the 2 rationals are so close together in value, I would not be surprised if that method of assigning the doubles is the culprit.
    Note that if you do:
    C:\>perl6 -e "say Num(0.7777777777777777777770e0) == Num(0.77777777777 +77777777771e0);" True
    then you avoid the "Rat to Num" conversion and get the correct result.
    (The two values are deemed equal because, of course, they both equate to the same double.)

    And I believe that last one-liner can equivalently be written as:
    C:\>perl6 -e "say 0.7777777777777777777770e0 == 0.77777777777777777777 +71e0;" True

    Cheers,
    Rob

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1201595]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others exploiting the Monastery: (4)
As of 2024-03-29 00:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found