Edit report at http://bugs.php.net/bug.php?id=51518&edit=1

 ID:               51518
 Updated by:       ras...@php.net
 Reported by:      krenshala at koboldi dot net
 Summary:          should add to zero, but gets 1.1102230246252E-16
                   instead
 Status:           Bogus
 Type:             Bug
 Package:          Math related
 Operating System: Multiple
 PHP Version:      5.2.13

 New Comment:

The fix here is to decide on your precision and do:



$output = round(0.9 + ($input * 0.3), 2);  // 2-decimal precision


Previous Comments:
------------------------------------------------------------------------
[2010-04-09 05:05:12] ras...@php.net

Floating point values have a limited precision. Hence a value might 
not have the same string representation after any processing. That also
includes writing a floating point value in your script and directly 
printing it without any mathematical operations.

If you would like to know more about "floats" and what IEEE
754 is, read this:
http://docs.sun.com/source/806-3568/ncg_goldberg.html
 
Thank you for your interest in PHP.

.

------------------------------------------------------------------------
[2010-04-09 05:03:27] krenshala at koboldi dot net

Description:
------------
Math error for code that should be returning zero, but instead returns
1.1102230246252E-16 on multiple systems using multiple versions of PHP.



The problem is that when the input value is -3 the output value should
be zero: 0.9 + (-3 * 0.3) = 0.9 - 0.9 = 0.  If the calculated value is
non-zero the error does not occur.



I first saw the error on a WinXP (Home SP3, 32bit) system running PHP
5.2.9-1, but it also shows up on a MAC (10.6.2) with PHP 5.3.0
installed.  I'm in the process of upgrading PHP (to 5.2.13) on my Gentoo
box to test it there but haven't had a chance to do so yet.

Test script:
---------------
my_function(-3);



function my_function($input){

  $output = 1;

  if($input <= 0)

    $output = 0.9 + ($input * 0.3);

  // the above should give 0.9 - 0.9 = 0

  echo "Verifying values: 0.9 - ".($input * 0.3)." is supposed to be
zero?\n";

  echo "Input: $input\tOutput: $output\n";

  return $output;

}

Expected result:
----------------
should have received zero (0).

Actual result:
--------------
actually received: 1.1102230246252E-16


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=51518&edit=1

Reply via email to