http://www.perlmonks.org?node_id=961266


in reply to Is this odd behavior a floating point problem?

For reasons described in excruciating detail in the document already cited, there will be errors, but according to a quick test on my system, they are nowhere near as large as you claim:

$ perl -e '$x=0.001; $sum += $x for 1..40; printf "%.20f", $sum/40' 0.00100000000000000067

Looks more like a "one off" error to me (i.e. summing over one more than you divide by):

$ perl -e '$x=0.001; $sum += $x for 0..40; printf "%.20f", $sum/40' 0.00102500000000000074

Replies are listed 'Best First'.
Re^2: Is this odd behavior a floating point problem?
by Anonymous Monk on Mar 24, 2012 at 00:47 UTC

    :D Looks like two separate off-by-one error (OBOE) errors to me :)

    First you start with non-zero and add 40 times (one too many), then you start with non-zero and add 41 times (one too many twice).

    If you start with non-zero you need to add only 39 times, or start with zero and add 40 times :)

    In short

    perl -MData::Dump -e " @f = map { 0.001 } 1 .. 40; dd\@f; $o = 0; for( +@f){ dd $o+=$_; } dd int @f; dd $o/int(@f); " perl -MData::Dump -e " $o = 0; for(1 .. 40){ dd $o+= 0.001; } dd $o/4 +0; "

    It didn't dawn on me to check wickedjesters (or your) math until ww raised the quesiton

      ... you start with non-zero ...

      Not sure what you're talking about.

      n times adding x to zero is mathematically (but not necessarily numerically) the same as n * x.

      $ perl -le '$sum += 1 for 1..40; print $sum' 40

      So where is the problem?  I think you overlooked that $sum is initially undef/zero.