Edit report at https://bugs.php.net/bug.php?id=62240&edit=1
ID: 62240
User updated by: zuallauz at gmail dot com
Reported by: zuallauz at gmail dot com
Summary: 5.4.3 regression, converting from float to int gives
incorrect output
Status: Not a bug
Type: Bug
Package: *General Issues
Operating System: Ubuntu 12.04 32-bit
PHP Version: 5.4.3
Block user comment: N
Private report: N
New Comment:
Actually I may just use the code below now that I've been reading up on the
perils of converting from float to int in PHP:
$num = log(8, 2);
$num = (int) number_format($num, 0, '.', '');
Previous Comments:
------------------------------------------------------------------------
[2012-06-07 07:25:04] zuallauz at gmail dot com
I have put in a quick hack for now by converting from float to string first
then converting to int. This seems to get the correct output:
$num = (int) (string) log(8, 2);
var_dump($num);
Output: int(3)
I don't think the problem lies in the log() function at all as that correctly
retrieves the float(3) result. It's the conversion from the float to integer
that is doing the incorrect calculation. Likely the log(8, 2) does not result
in a perfect 3, it might actually be 2.9999999999999999 so there could be a
conversion error happening.
My test machine is running Ubuntu server 32-bit, so maybe the 64-bit edition
has enough precision to do the integer conversion properly. I was talking to a
colleague today and he mentioned there were some float to integer optimisations
done in 5.3.11 that changed things?
------------------------------------------------------------------------
[2012-06-06 14:05:13] [email protected]
Yes, I doubt upgrading to 5.4.4 is likely to fix your case. I have no idea why
your libmath log() call isn't returning a more accurate value here. I tested
this
on a 64-bit Ubuntu 12.04 and couldn't reproduce it.
------------------------------------------------------------------------
[2012-06-06 12:57:40] [email protected]
The only change in log() between these two versions is the handling of the case
where base == 1, as you can see with:
git diff php-5.3.3 php-5.4.3 -- ext/standard/math.c
log() is taken from math.h, so I guess the explanation here is that you were
using a different libm.
------------------------------------------------------------------------
[2012-06-06 08:53:43] zuallauz at gmail dot com
Ok, so is 5.4.4 likely to be released this month? I will have to put a manual
hack in my app until it is released I think.
------------------------------------------------------------------------
[2012-06-06 08:41:31] [email protected]
I am not able to reproduce this in PHP 5.4.4
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=62240
--
Edit this bug report at https://bugs.php.net/bug.php?id=62240&edit=1