ID: 16551 Updated by: [EMAIL PROTECTED] Reported By: [EMAIL PROTECTED] -Status: Open +Status: Bogus Bug Type: Variables related Operating System: i686-pc-linux-gnu PHP Version: 4.0CVS-2002-04-11 New Comment:
The php functions just wrap calls to the underlining C library. On Linux glibc happens to return -0 on ceil. Very little we can do here. Previous Comments: ------------------------------------------------------------------------ [2002-04-24 09:26:23] [EMAIL PROTECTED] Hi derick, here is the proof of my statement. try this code: <?php echo "<tt>(machine code representation)<br><br>"; // correct result $b1=0; $p=pack('f',$b1); echo " $b1 = "; for ($l=0,$o1='';$l<strlen($p);$l++){ $o1.=sprintf('%02X',ord($p[$l])); } echo $o1.'h'; echo '<hr size=1>'; //wrong result $a=-0.1; $b2=round($a); $p=pack('f',$b2); echo "$b2 = "; for ($l=0,$o2='';$l<strlen($p);$l++){ $o2.=sprintf('%02X',ord($p[$l])); } echo $o2.'h'; echo "<hr>the question is, is $b1 == $b2<br>"; echo "php mean:<br><font color=#000088>"; if ($b1==$b2) echo "yes, this is true.<br>"; else echo "no, this is false.<br>"; echo "</font>but $o1 != $o2<br>"; echo "and also $o2 != 0"; echo "</tt>"; ?> The big problem with this behavior is, if you using round() or ceil() to output results of mathematical function, you can't be sure if the result what you expected or not. This can have fatal consequences for programs they output e.g. statitics in text files and other programs interpret the php results wrong! This is not a trivial problem! ------------------------------------------------------------------------ [2002-04-24 08:34:50] [EMAIL PROTECTED] Bogus? It is true that ceil() and round() return floating point numbers, but -0 is not a number. ------------------------------------------------------------------------ [2002-04-24 08:27:16] [EMAIL PROTECTED] This is expected behavior. ceil() and floor() return a float because of the large range of supported numbers. Derick ------------------------------------------------------------------------ [2002-04-24 08:24:51] [EMAIL PROTECTED] The problem is also affected on round(). <?php $a=-0.1 echo round($a); // results: -0 ?> Regards, Steve ------------------------------------------------------------------------ [2002-04-11 09:38:05] [EMAIL PROTECTED] Hi, the follow code results -0, <?php $a=ceil((1/16)-1); echo $a; ?> maybe, this is a convertion problem with float types. also, why the ceil() command results a floating point number and not an integer? It makes sense when the ceil command accept a precision like round()... Regards, Steve ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=16551&edit=1