svn: /phpdoc/ru/trunk/language/types/ float.xml
| From: | Shein Alexey | Date: | Tue, 23 Nov 2010 07:47:10 +0000 |
| Subject: | svn: /phpdoc/ru/trunk/language/types/ float.xml | ||
| Groups: | php.doc.ru | ||
| Request: | Send a blank email to doc-ru+get-1189@lists.php.net to get a copy of this message | ||
shein Tue, 23 Nov 2010 07:47:10 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=305681
Log:
Renewed translation.
Changed paths:
U phpdoc/ru/trunk/language/types/float.xml
Modified: phpdoc/ru/trunk/language/types/float.xml
===================================================================
--- phpdoc/ru/trunk/language/types/float.xml 2010-11-23 05:15:20 UTC (rev 305680)
+++ phpdoc/ru/trunk/language/types/float.xml 2010-11-23 07:47:10 UTC (rev 305681)
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- EN-Revision: 301112 Maintainer: shein Status: ready -->
+<!-- EN-Revision: 305581 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<!-- $Id$ -->
<sect1 xml:id="language.types.float">
@@ -45,22 +45,30 @@
<title>Точность чисел с плавающей точкой</title>
<para>
- Довольно часто простые десятичные дроби вроде
<literal>0.1</literal>
- или <literal>0.7</literal> не могут быть преобразованы в
их внутреннюю двоичную форму
+ Числа с плавающей точкой имеют ограниченную
точность. Хотя это
+ зависит от операционной системы, в PHP обычно
используется формат
+ двойной точности IEEE 754, дающий максимальную
относительную ошибку
+ округления порядка 1.11e-16.
+ Неэлементарные арифметические операции могут
давать большие ошибки,
+ и, разумеется, необходимо принимать во внимание
разрастание ошибок
+ при совместном использовании нескольких операции.
+ </para>
+
+ <para>
+ Кроме того, рациональные числа, которые могут быть
точно представлены
+ в виде чисел с плавающей точкой с основанием 10,
например,
+ <literal>0.1</literal> или <literal>0.7</literal>, не имеют
+ точного внутреннего представления в качестве чисел
с плавающей точкой
+ с основанием 2, вне зависимости от размера мантиссы.
+ Поэтому они и не могут быть преобразованы в их
внутреннюю двоичную форму
без небольшой потери точности. Это может привести к
неожиданным результатам:
например, <literal>floor((0.1+0.7)*10)</literal> скорее всего
вернет
<literal>7</literal> вместо ожидаемого
<literal>8</literal>, так как
результат внутреннего представления будет чем-то
вроде
- <literal role="infdec">7.9</literal>.
+ <literal>7.9999999999999991118...</literal>.
</para>
<para>
- Это связано с невозможностью точно выразить
некоторые дроби в десятичной системе
- счисления конечным числом цифр. Например,
<literal>1/3</literal> в десятичной форме
- принимает вид <literal role="infdec">0.3</literal>.
- </para>
-
- <para>
Так что никогда не доверяйте точности чисел с
плавающей точкой до последней цифры,
и никогда не проверяйте их на равенство.
Если вам действительно необходима высокая точность,
используйте