Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Why do I get random numbers?

by AnomalousMonk (Archbishop)
on Jun 14, 2018 at 22:36 UTC ( [id://1216678]=note: print w/replies, xml ) Need Help??


in reply to Why do I get random numbers?

... manipulate the formatting of a number ... %.{$var}f does the trick.

Another way is the printf  * format specifier:

c:\@Work\Perl\monks>perl -wMstrict -le "my $p = 30; my $n = 1.111111111111111111111111111111; ;; printf '%0.*f', $p, $n; " 1.111111111111111200000000000000
See sprintf for a discussion of all format specifiers.

Update: Actually,  %.{$var}f doesn't do any trick except to produce an "Invalid conversion in printf..." warning. But the syntax is correct in the OPed example code:
    printf( "%.${dig}f", $num );


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: Why do I get random numbers?
by Cleggy (Initiate) on Jun 15, 2018 at 08:45 UTC

    RE :Update: Actually, %.{$var}f doesn't do any trick except to produce an "Invalid conversion in printf..." warning. But the syntax is correct in the OPed example code: printf( "%.${dig}f", $num );

    works for me in :

    perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux-gnu-thread-multi (with 101 registered patches)

    Doesn't throw any warnings.

    And sorry for the obviously FAQ however I was surprised that the data changed as I had not done any mathematical calculation on it just stored it and asked for some of it back. However I have obviously specified it is a numerical value by using printf.

    Oh and I have now read " What Every Programmer Should Know About Floating-Point Arithmetic."

    Consider me (somewhat) enlightened (on this topic).

    and when I get a minute I will look at Math::BigFloat:

    Many thanks

    Cleggy

      ... %.{$var}f doesn't do any trick except to produce [a] ... warning.
      works for me in ... perl 5, version 20 ... Doesn't throw any warnings.

      I'm surprised to read that it works in 5.20. I don't see any mention of a new format specifier in the latest sprintf docs. The best I can test in ATM is 5.14:

      c:\@Work\Perl\monks>perl -wMstrict -le "print 'perl version: ', $]; ;; my $p = 30; my $n = 1.111111111111111111111111111111; ;; printf qq{%0.{$p}f}, $n; " perl version: 5.014004 Invalid conversion in printf: "%0.{" at -e line 1. %0.{30}f

      ... I was surprised that the data changed ...

      As to this, I'm sure that, having now read the docs, you realize that IEEE-754 floating point representation (or any other finite representation) is only an approximation that may sometimes happen to be exact, and that it handles base-2 relative-prime fractions no better than base-10 handles 1/3.


      Give a man a fish:  <%-{-{-{-<

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (5)
As of 2024-03-28 13:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found