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....