php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #16551 ceil results -0
Submitted: 2002-04-11 09:38 UTC Modified: 2002-04-24 12:19 UTC
From: alberty at neptunelabs dot de Assigned:
Status: Not a bug Package: Variables related
PHP Version: 4.0CVS-2002-04-11 OS: i686-pc-linux-gnu
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: alberty at neptunelabs dot de
New email:
PHP Version: OS:

 

 [2002-04-11 09:38 UTC] alberty at neptunelabs dot de
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

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2002-04-24 08:24 UTC] alberty at neptunelabs dot de
The problem is also affected on round().

<?php
$a=-0.1
echo round($a);
// results: -0
?>

Regards,

Steve
 [2002-04-24 08:27 UTC] derick@php.net
This is expected behavior. ceil() and floor() return a float because of the large range of supported numbers.

Derick
 [2002-04-24 08:34 UTC] alberty at neptunelabs dot de
Bogus?

It is true that ceil() and round() return floating point numbers, but -0 is not a number.
 [2002-04-24 09:26 UTC] alberty at neptunelabs dot de
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 12:19 UTC] edink@php.net
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.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Tue Apr 30 02:01:31 2024 UTC