Bug #62240 [Nab]: 5.4.3 regression, converting from float to int gives incorrect output

From: Date: Thu, 07 Jun 2012 08:48:37 +0000
Subject: Bug #62240 [Nab]: 5.4.3 regression, converting from float to int gives incorrect output
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-171096@lists.php.net to get a copy of this message
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: Hmm, I get the same output with 64 zeros: 3.0000000000000000000000000000000000000000000000000000000000000000 Previous Comments: ------------------------------------------------------------------------ [2012-06-07 08:08:25] rasmus@php.net Well, float to int conversion issues isn't a PHP-specific thing. Try this little C program on your machine, for example: #include <stdio.h> #include <math.h> int main(char *argv[], int argc) { printf("%.64f\n",log(8)/log(2)); } If you name the file, "a.c" you can just type: make a then run it with: ./a My output on 64-bit Ubuntu: 10:07am x220:~> ./a 3.0000000000000000000000000000000000000000000000000000000000000000 It would be interesting to see your output. ------------------------------------------------------------------------ [2012-06-07 07:50:15] zuallauz at gmail dot com 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, '.', ''); ------------------------------------------------------------------------ [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] rasmus@php.net 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] cataphract@php.net 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. ------------------------------------------------------------------------ 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

« previous php.bugs (#171096) next »