Bug #55368 [Com]: ini_set('precision',16) is affecting a simple math result
| From: | jeremie dot gw at gmail dot com | Date: | Fri, 05 Aug 2011 08:40:09 +0000 |
| Subject: | Bug #55368 [Com]: ini_set('precision',16) is affecting a simple math result | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-162430@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=55368&edit=1
ID: 55368
Comment by: jeremie dot gw at gmail dot com
Reported by: ygautheron at absystech dot fr
Summary: ini_set('precision',16) is affecting a simple math
result
Status: Open
Type: Bug
Package: *Math Functions
Operating System: Linux Gentoo (2.6.38-gentoo-r6)
PHP Version: 5.3.6
Block user comment: N
Private report: N
New Comment:
I don't think it is a php bug. I have the same result with C code.
Source :
--------
#include "stdio.h"
int main(){
double a;
a=(1.196-1)*100;
printf("Result=%.16f\n",a);
return 0;
}
Result :
--------
19.5999999999999943
Architecture :
--------------
Ubuntu 10.04 x86
Linux 2.6.32-33-generic #71-Ubuntu SMP Wed Jul 20 17:30:40 UTC 2011 i686
GNU/Linux
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
Previous Comments:
------------------------------------------------------------------------
[2011-08-05 08:29:07] ygautheron at absystech dot fr
Just noticed that i we try 0.196*100 it works good too.
The problem seems to come from the substract ?
------------------------------------------------------------------------
[2011-08-05 08:21:32] ygautheron at absystech dot fr
Description:
------------
Hello,
The simple calculation does not result the same if we set the precision to 16. Maybe it's cpu
architecture related ?
Precision lower than 16 :
(1.196 - 1) * 100 => 19.6
Precision 16 :
(1.196 - 1) * 100 => 19.59999999999999
Precision 17 :
(1.196 - 1) * 100 => 19.599999999999994
...
Here's the configure parameters :
'./configure' '--prefix=/usr' '--build=x86_64-pc-linux-gnu'
'--host=x86_64-pc-linux-gnu' '--mandir=/usr/share/man'
'--infodir=/usr/share/info' '--datadir=/usr/share' '--sysconfdir=/etc'
'--localstatedir=/var/lib' '--prefix=/usr/lib64/php5.3'
'--mandir=/usr/lib64/php5.3/man' '--infodir=/usr/lib64/php5.3/info'
'--libdir=/usr/lib64/php5.3/lib' '--with-libdir=lib64'
'--without-pear' '--disable-maintainer-zts' '--enable-bcmath'
'--with-bz2' '--enable-calendar' '--with-curl'
'--with-curlwrappers' '--without-enchant' '--enable-exif'
'--enable-ftp' '--with-gettext' '--without-gmp'
'--without-mhash' '--disable-intl' '--without-kerberos'
'--enable-mbstring' '--with-mcrypt' '--without-mssql'
'--with-onig=/usr' '--with-openssl' '--with-openssl-dir=/usr'
'--disable-pcntl' '--without-pgsql' '--without-pspell'
'--without-recode' '--disable-shmop' '--with-snmp'
'--disable-soap' '--enable-sockets' '--without-sqlite3'
'--without-sybase-ct' '--disable-sysvmsg' '--disable-sysvsem'
'--disable-sysvshm' '--with-tidy' '--disable-wddx'
'--with-xmlrpc' '--with-xsl' '--enable-zip' '--with-zlib'
'--disable-debug' '--enable-dba' '--without-cdb'
'--with-db4' '--disable-flatfile' '--with-gdbm'
'--disable-inifile' '--without-qdbm' '--with-freetype-dir=/usr'
'--with-t1lib=/usr' '--disable-gd-jis-conv' '--with-jpeg-dir=/usr'
'--with-png-dir=/usr' '--without-xpm-dir' '--with-gd'
'--with-imap' '--with-imap-ssl' '--with-ldap'
'--without-ldap-sasl' '--with-mysql=/usr'
'--with-mysql-sock=/var/run/mysqld/mysqld.sock'
'--with-mysqli=/usr/bin/mysql_config' '--with-unixODBC=/usr'
'--without-adabas' '--without-birdstep' '--without-dbmaker'
'--without-empress' '--without-esoob' '--without-ibm-db2'
'--without-sapdb' '--without-solid' '--with-iodbc=/usr'
'--without-oci8' '--with-oci8=instantclient,/usr/lib/oracle/10.2.0.3/client/lib'
'--without-pdo-dblib' '--with-pdo-mysql=/usr' '--without-pdo-pgsql'
'--without-pdo-sqlite' '--with-pdo-odbc=unixODBC,/usr'
'--with-pdo-oci=instantclient,/usr,10.2.0.3' '--with-readline'
'--without-libedit' '--without-mm' '--without-sqlite'
'--with-pic' '--with-pcre-regex=/usr' '--with-pcre-dir=/usr'
'--with-config-file-path=/etc/php/apache2-php5.3'
'--with-config-file-scan-dir=/etc/php/apache2-php5.3/ext-active'
'--disable-embed' '--disable-cli' '--disable-cgi'
'--disable-fpm' '--with-apxs2=/usr/sbin/apxs'
Test script:
---------------
Interactive shell
php > var_dump(phpversion());
string(16) "5.3.6-pl0-gentoo"
php > var_dump((1.196-1)*100);
float(19.6)
php > var_dump(ini_get('precision'));
string(2) "14"
php > var_dump(ini_set('precision',14));
string(2) "14"
php > var_dump((1.196-1)*100);
float(19.6)
php > var_dump(ini_set('precision',15));
string(2) "14"
php > var_dump((1.196-1)*100);
float(19.6)
php > var_dump(ini_set('precision',16));
string(2) "15"
php > var_dump((1.196-1)*100);
float(19.59999999999999)
php > var_dump(ini_set('precision',17));
string(2) "16"
php > var_dump((1.196-1)*100);
float(19.599999999999994)
php > var_dump(ini_set('precision',18));
string(2) "17"
php > var_dump((1.196-1)*100);
float(19.5999999999999943)
Expected result:
----------------
I think the result must always be the same : (float)19.6
Actual result:
--------------
php > var_dump(ini_set('precision',16));
string(2) "15"
php > var_dump(("1.196"-1)*100);
float(19.59999999999999)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=55368&edit=1