Edit report at http://bugs.php.net/bug.php?id=53045&edit=1

 ID:                 53045
 Updated by:         [email protected]
 Reported by:        remy at wh dot nl
 Summary:            broken result of intval()
 Status:             Open
 Type:               Bug
 Package:            *Math Functions
 Operating System:   FreeBSD
 PHP Version:        5.2.14
 Block user comment: N

 New Comment:

Not sure there is a whole lot we can do about this.  It is a typical
IEEE-754 

precision problem.  Try this simple C program, for example:



[a.c]

#include <stdio.h>

#include <math.h>

int main(int argc, char *argv[]) {

        printf("%.16f\n",log(8) / log(2));

}



LDFLAGS=-lm make a



./a



I get: 3.0000000000000000



I bet you get 2.9999999999999996

or something along those lines.



We might be able to do something clever with PHP's precision setting
internally 

and round to that precision before doing the truncation there, but in
reality 

you are dealing with floating point numbers here and whenever you deal
with 

floating point numbers when programming you have to treat them as 

approximations, never as exact values.  Unless you are using arbitrary
precision 

functions such as the gmp or bcmath function (which are orders of
magnitude 

slower) you are going to have to account for these imprecisions in your
code.


Previous Comments:
------------------------------------------------------------------------
[2010-10-13 08:38:16] remy at wh dot nl

php -i output:



phpinfo()

PHP Version => 5.2.14



System => FreeBSD xxx.xxx.com 7.3-STABLE FreeBSD 7.3-STABLE #7: Thu Jul
15 20:09:49 CEST 2010     [email protected]:/usr/obj/usr/src/sys/XXX
i386

Build Date => Sep 22 2010 20:07:20

Configure Command =>  './configure'  '--with-libxml-dir=/usr/local/lib'
'--with-config-file-path=/home/www/php' '--with-zlib' '--with-mysql'
'--with-pgsql' '--enable-calendar' '--enable-mbstring'
'--with-apxs2=/home/www/bin/apxs' '--enable-ftp' '--with-gd'
'--enable-mbregex' '--enable-gd-native-ttf'
'--with-png-dir=/usr/local/lib' '--with-jpeg-dir=/usr/local/lib'
'--with-xpm-dir=/usr/X11R6/lib' '--with-freetype-dir=/usr/local/lib'
'--with-iconv' '--with-curl' '--with-bz2'

------------------------------------------------------------------------
[2010-10-13 08:33:34] remy at wh dot nl

var_dump( unpack("H*",pack("d", 3.0000)) );

var_dump( unpack("H*",pack("d", log(8,2))) );



array(1) {

  [1]=>

  string(16) "0000000000000840"

}

array(1) {

  [1]=>

  string(16) "ffffffffffff0740"

}

------------------------------------------------------------------------
[2010-10-13 05:25:02] [email protected]

I can't reproduce on mipsel/32-bit/Linux, PHP 5.2.14.



Can you show us the result of this:



<?php

var_dump( unpack("H*",pack("d", 3.0000)) );

var_dump( unpack("H*",pack("d", log(8,2))) );



I get



array(1) {

  [1]=>

  string(16) "0000000000000840"

}

array(1) {

  [1]=>

  string(16) "0000000000000840"

}

------------------------------------------------------------------------
[2010-10-12 19:33:45] remy at wh dot nl

CPU: Intel(R) Pentium(R) 4 CPU 3.20GHz (3211.39-MHz 686-class CPU)

  Origin = "GenuineIntel"  Id = 0xf43  Family = f  Model = 4  Stepping =
3

 
Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DT

S,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>

  Features2=0x649d<SSE3,DTES64,MON,DS_CPL,EST,CNXT-ID,CX16,xTPR>

  AMD Features=0x20000000<LM>

  Logical CPUs per core: 2

------------------------------------------------------------------------
[2010-10-12 19:30:32] remy at wh dot nl

Yes, 32bit, here is some hardware and OS info from sysctl:



kern.ostype: FreeBSD

kern.osrelease: 7.3-STABLE

kern.osrevision: 199506

kern.version: FreeBSD 7.3-STABLE #7: Thu Jul 15 20:09:49 CEST 2010

kern.maxvnodes: 100000

kern.maxproc: 6164

kern.maxfiles: 12328

kern.argmax: 262144

kern.securelevel: -1

kern.clockrate: { hz = 1000, tick = 1000, profhz = 2000, stathz = 133 }

kern.posix1version: 200112

kern.ngroups: 16

kern.job_control: 1

kern.saved_ids: 0

kern.boottime: { sec = 1281862574, usec = 963320 } Sun Aug 15 10:56:14
2010

kern.domainname:

kern.osreldate: 703100

kern.bootfile: /boot/kernel/kernel

kern.maxfilesperproc: 11095

kern.maxprocperuid: 5547

hw.machine: i386

hw.model: Intel(R) Pentium(R) 4 CPU 3.20GHz

hw.ncpu: 2

hw.byteorder: 1234

hw.physmem: 2134020096

hw.usermem: 1906421760

hw.pagesize: 4096

hw.floatingpoint: 1

hw.machine_arch: i386

hw.realmem: 2147155968

------------------------------------------------------------------------


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

    http://bugs.php.net/bug.php?id=53045


-- 
Edit this bug report at http://bugs.php.net/bug.php?id=53045&edit=1

Reply via email to