[comp.lang.perl] Addition of floating point problem

uaa1006@dircon.co.uk (Peter Miles) (05/08/91)

Hi...I'm trying to write some maths scripts for perl and have 
been have a major problem. This is best summed up by the following:

$ perl -e 'print 0.5 + 0.2,"\n"'
0.6999999999999996
$

What's going on? I'm running perl verion 4.0.1.1 patchlevel 3 on
SCO UNIX 386 v 3.2.2. It's the version from comp.sources.misc.

                -- Pete
-- 
Pete Miles			uaa1006@dircon.co.uk
				...ukc!dircon!uaa1006

tchrist@convex.COM (Tom Christiansen) (05/08/91)

From the keyboard of uaa1006@dircon.co.uk (Peter Miles):
:
:Hi...I'm trying to write some maths scripts for perl and have 
:been have a major problem. This is best summed up by the following:
:
:$ perl -e 'print 0.5 + 0.2,"\n"'
:0.6999999999999996
:$
:
:What's going on? I'm running perl verion 4.0.1.1 patchlevel 3 on
:SCO UNIX 386 v 3.2.2. It's the version from comp.sources.misc.

What's going is that your floating point hardware is giving you a value
that isn't getting rounded enough for your tastes.  Even though you say .7
and .2, you can't represent these values precisely in the internal
floating point notation.

Remember: God created the integers; and all else is the work 
of Man (and it shows :-).

You could set $# to something like '%.1g' to change the default
output format or better yet use a printf.

(From the man page:)

     $#      The output format for printed numbers.  This vari-
             able is a half-hearted attempt to emulate awk's OFMT
             variable.  There are times, however, when awk and
             perl have differing notions of what is in fact
             numeric.  Also, the initial value is %.20g rather
             than %.6g, so you need to set $# explicitly to get
             awk's value.  (Mnemonic: # is the number sign.)

On a Convex, this statement:

    perl -e 'print .7, "\n"'

yields 

    0.7

but on a Sun, I get this:

    .69999999999999995559



--tom
--
Tom Christiansen		tchrist@convex.com	convex!tchrist
		"So much mail, so little time." 

loren@ural.Eng.Sun.COM (05/09/91)

In article <1991May07.174519.13307@dircon.co.uk> uaa1006@dircon.co.uk
(Peter Miles) writes:
>
>Hi...I'm trying to write some maths scripts for perl and have 
>been have a major problem. This is best summed up by the following:
>
>$ perl -e 'print 0.5 + 0.2,"\n"'
>0.6999999999999996
>$
>
>What's going on? I'm running perl verion 4.0.1.1 patchlevel 3 on
>SCO UNIX 386 v 3.2.2. It's the version from comp.sources.misc.

This is exactly what the %g in printf is for.  Try the following:

    $ perl -e 'printf "%g\n", 0.5 + 0.2'
    0.7

The problem you have is because there is no *exact* representation
for .2 in most floating point systems.  The %g format specifier is
designed to take care of exactly this problem.

-----------------------------------------------------------------------------
Mr Loren L. Hart                        The Ada Ace Group, Inc
loren@cup.portal.com                    P.O. Box 36195
                                        San Jose, CA  95158