note 71167 added to language.types.float

From: 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

« previous php.notes (#119726) next »