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
View Add Comment Developer Edit
Welcome! If you don't have a Git account, you can't do anything here.
You can add a comment by following this link or if you reported this bug, you can edit this bug over here.
(description)
Block user comment
Status: Assign to:
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: Thu Apr 25 11:01:30 2024 UTC