Bug #61855 [Nab]: Wrong division of float numbers
| From: | rasmus@php.net | Date: | Thu, 26 Apr 2012 07:51:41 +0000 |
| Subject: | Bug #61855 [Nab]: Wrong division of float numbers | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-169947@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=61855&edit=1
ID: 61855
Updated by: rasmus@php.net
Reported by: martin dot edlman at gmail dot com
Summary: Wrong division of float numbers
Status: Not a bug
Type: Bug
Package: Math related
Operating System: Linux
PHP Version: 5.3.10
Block user comment: N
Private report: N
New Comment:
And just for the record, no, the same C code definitely does not return the
"correct numbers" as you put it:
#include <stdio.h>
#include <math.h>
int main(char *argv[], int argc) {
double a = 1.2;
double b = 0.4;
double v = a/b;
printf("v(15) = %.15f\n", v);
printf("v(16) = %.16f\n", v);
printf("v = %f\n", v);
printf("floor(v) = %f\n",floor(v));
}
That, I hope you would agree, is the closest thing to the same C code.
% cc a.c -o a -lm
% ./a
v(15) = 3.000000000000000
v(16) = 2.9999999999999996
v = 3.000000
floor(v) = 2.000000
That looks remarkably like the PHP output.
Previous Comments:
------------------------------------------------------------------------
[2012-04-26 07:33:20] pajoye@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://www.floating-point-gui.de/
Thank you for your interest in PHP.
------------------------------------------------------------------------
[2012-04-26 06:53:50] martin dot edlman at gmail dot com
Description:
------------
---
From manual page: http://www.php.net/function.floor#refsect1-function.floor-description
---
I encountered problem when dividing float numbers. It's simple formula which can be solved by
10 year old child. But not by PHP! See example.
The problem is that displayed value (3) doesn't correspond with internal value
2.999999999999999 and floor() then returns 2 which is obviously incorrect result! And that's
serious problem.
The same code in C returns correct numbers.
Test script:
---------------
<?php
$a = 1.2;
$b = 0.4;
$v = $a / $b;
printf("v(15) = %.15f\n", $v);
printf("v(16) = %.16f\n", $v);
print "v = $v\n";
print "floor(v) = ".floor($v)."\n";
?>
Expected result:
----------------
v(15) = 3.000000000000000
v(16) = 3.0000000000000000
v = 3
floor(v) = 3
Actual result:
--------------
v(15) = 3.000000000000000
v(16) = 2.9999999999999996
v = 3
floor(v) = 2
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=61855&edit=1