From 2a7d8cd25bf2940d367122921992bcbeb82eaeb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustavo=20Andr=C3=A9=20dos=20Santos=20Lopes?= Date: Sat, 20 Nov 2010 16:10:04 +0000 Subject: [PATCH] - Fixed inaccurate information on floats. Closes bug #53365. git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@305581 c90b9560-bf6c-de11-be94-00142212c4b1 --- language/types/float.xml | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/language/types/float.xml b/language/types/float.xml index 5d0a30c867..3fd2946641 100644 --- a/language/types/float.xml +++ b/language/types/float.xml @@ -44,20 +44,25 @@ EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM}) Floating point precision - It is typical that simple decimal fractions like 0.1 or - 0.7 cannot be converted into their internal binary + Floating point numbers have limited precision. Although it depends on the + system, PHP typically uses the IEEE 754 double precision format, which will + give a maximum relative error due to rounding in the order of 1.11e-16. + Non elementary arithmetic operations may give larger errors, and, of course, + error progragation must be considered when several operations are + compounded. + + + + Additionally, rational numbers that are exactly representable as floating + point numbers in base 10, like 0.1 or + 0.7, do not have an exact representation as floating + point numbers in base 2, which is used internally, no matter the size of + the mantissa. Hence, they cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like - 7.9. - - - - This is due to the fact that it is impossible to express some - fractions in decimal notation with a finite number of digits. For instance, - 1/3 in decimal form becomes - 0.3. + 7.9999999999999991118....