note 71167 added to language.types.float
| From: | sinuhet at osu1 dot php dot net | Date: | Tue, 14 Nov 2006 16:04:32 +0000 |
| Subject: | note 71167 added to language.types.float | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-119726@lists.php.net to get a copy of this message | ||
<?php
define('EPSILON', 1.0e-8);
function real_cmp($r1, $r2)
{
$diff = $r1 - $r2;
if( abs($diff) < EPSILON )
return 0;
else
return $diff < 0 ? -1 : 1;
}
function real_lt($r1, $r2)
{
return real_cmp($r1, $r2) < 0;
}
echo "raw compare\n";
$n = 0;
for($i = 0.1; $i < 1.0; $i += 0.1) {
$n++;
echo "$i\t$n\n";
}
echo "\nepsilon compare\n";
$n = 0;
for($i = 0.1; real_lt($i, 1.0); $i += 0.1) {
$n++;
echo "$i\t$n\n";
}
/*
Outputs:
raw compare
0.1 1
0.2 2
0.3 3
0.4 4
0.5 5
0.6 6
0.7 7
0.8 8
0.9 9
1 10
epsilon compare
0.1 1
0.2 2
0.3 3
0.4 4
0.5 5
0.6 6
0.7 7
0.8 8
0.9 9
*/
?>
So moral of this program? "Never compare floating point numbers for equality" solves only
half of the problem. As seen above, even raw comparing of floats for less than (or grater than) is
dangerous and epsilon (round, etc.) must be used.
----
Server IP: 147.32.160.17
Probable Submitter: 82.100.0.98
----
Manual Page -- http://www.php.net/manual/en/language.types.float.php
Edit -- https://master.php.net/note/edit/71167
Del: integrated -- https://master.php.net/note/delete/71167/integrated
Del: useless -- https://master.php.net/note/delete/71167/useless
Del: bad code -- https://master.php.net/note/delete/71167/bad+code
Del: spam -- https://master.php.net/note/delete/71167/spam
Del: non-english -- https://master.php.net/note/delete/71167/non-english
Del: in docs -- https://master.php.net/note/delete/71167/in+docs
Del: other reasons-- https://master.php.net/note/delete/71167
Reject -- https://master.php.net/note/reject/71167
Search -- https://master.php.net/manage/user-notes.php