svn: /phpdoc/bg/trunk/language/types/ float.xml
[email protected] (Stanislav Yordanov) Sun, 13 Dec 2015 13:27:13 +0000
| Newsgroups | php.doc.bg |
|---|---|
| Message-ID | <[email protected]> |
stanprog Sun, 13 Dec 2015 13:27:13 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=338247
Log:
sync to en (In Progress)
Changed paths:
U phpdoc/bg/trunk/language/types/float.xml
svn-diffs-338247.txt
(text/x-diff, 10.2 KB)
Modified: phpdoc/bg/trunk/language/types/float.xml
===================================================================
--- phpdoc/bg/trunk/language/types/float.xml 2015-12-12 17:21:46 UTC (rev 338246)
+++ phpdoc/bg/trunk/language/types/float.xml 2015-12-13 13:27:13 UTC (rev 338247)
@@ -1,13 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
-<!-- EN-Revision: n/a Maintainer: kouber Status: ready -->
-<sect1 xml:id="language.types.float">
+<!-- EN-Revision: 329281 Maintainer: stanprog Status: in_progress -->
+<!-- Reviewed: yes Maintainer: stanprog -->
+<!-- CREDITS: kouber -->
+<sect1 xml:id="language.types.float" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Числа с плаваща запетая</title>
+
<para>
Числата с плаваща запетая (също познати като "плаващи", "двойни" или "реални числа") могат да
- бъдат дефинирани посредством кой да е от следните синтаксиси:
- <informalexample>
- <programlisting role="php">
+ бъдат дефинирани посредством кой да е от следните синтаксиси:
+ </para>
+
+ <informalexample>
+ <programlisting role="php">
<![CDATA[
<?php
$a = 1.234;
@@ -15,18 +20,24 @@
$c = 7E-10;
?>
]]>
- </programlisting>
- </informalexample>
+ </programlisting>
+ </informalexample>
+
+ <para>
Формално:
- <informalexample>
- <programlisting role="php">
+ </para>
+
+ <informalexample>
+ <programlisting>
<![CDATA[
LNUM [0-9]+
DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
-EXPONENT_DNUM ( ({LNUM} | {DNUM}) [eE][+-]? {LNUM})
+EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
]]>
- </programlisting>
- </informalexample>
+ </programlisting>
+ </informalexample>
+
+ <para>
Размерът на плаващите числа е платформено-зависим,
макар че обикновено максималната стойност е около ~1.8e308,
с 14-цифрена точност (64-битов IEEE формат).
@@ -34,44 +45,110 @@
<warning xml:id="warn.float-precision">
<title>Плаваща точност</title>
+
<para>
- В много случаи, прости десетични дроби като <literal>0.1</literal>
- или <literal>0.7</literal> не могат да бъдат превърнати във
- вътрешните им двоични еквиваленти без да претърпят малка загуба в точността.
- Това може да доведе до объркващи резултати: например
- <literal>floor((0.1+0.7)*10)</literal> в повечето случаи ще върне
- <literal>7</literal>, вместо очакваното <literal>8</literal>,
- тъй като вътрешното представяне в действителност е нещо
- подобно на <literal>7.9999999999...</literal>.
+ Числата с плаваща запетая имат ограничена точност. Въпреки, че това зависи от
+ системата, PHP обикновено използва формата с двойна точност IEEE 754, който
+ дава максимална относителна грешка, поради закръгляване в реда 1.11e-16.
+ Неелементарните аритметически операции биха дали по-големи грешки, а разбира се,
+ разпространението на грешките трябва да се отчете, когато става дума за изпълнението
+ на няколко операции последователно.
</para>
+
<para>
- Това е свързано с факта, че някои дроби не могат да бъдат
- представени в десетичен вид с краен брой цифри.
- Например <literal>1/3</literal> в десетичен вид става
- <literal>0.3333333. . .</literal>.
+ Освен това рационалните числа, които могат да бъдат точно представени като числа
+ с плаваща запетая с основа 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>7.9999999999999991118...</literal>.
</para>
+
<para>
- Така че, никога не се доверявайте на последните цифри в резултати от
- плаващи числа и никога не сравнявайте числа с плаваща
- запетая за равенство. Ако наистина се нуждаете от по-висока
- точност, трябва да използвате математическите функции за <link
- linkend="ref.bc">произволна точност</link>
+ Така че, никога не се доверявайте на последните цифри в резултати от плаващи
+ числа и никога не сравнявайте числа с плаваща запетая за равенство. Ако наистина се нуждаете от по-висока точност,
+ трябва да използвате математическите функции за <link linkend="ref.bc">произволна точност</link>
или пък функциите <link linkend="ref.gmp">gmp</link>.
</para>
+
+ <para>
+ За „по-просто“ обяснение, вижте <link xlink:href="&url.floating.point.guide;">ръководство за работа с плаваща запетая</link>,
+ което е по-известно като „Защо не ми работят числата?“
+ </para>
</warning>
<sect2 xml:id="language.types.float.casting">
<title>Преобразуване в плаващ</title>
<para>
- За информация кога и как низовете биват преобразувани в плаващи,
- вижте раздела, озаглавен <link linkend="language.types.string.conversion">Превръщане на низ в число</link>.
- За стойности от други типове, преобразуването е същото, както ако
- стойността първо е била превърната в цяло число и после в плаващо. Вижте раздел <link linkend="language.types.integer.casting">Преобразуване в цяло число</link>
- за повече информация. След PHP 5, ще бъде хвърлено съобщение (notice) ако
+ За информация кога и как низовете биват преобразувани в плаващи, вижте
+ раздела, озаглавен <link linkend="language.types.string.conversion">Превръщане на низ в
+ число</link>.За стойности от други типове, преобразуването е същото, както ако стойността първо е била
+ превърната в цяло число и после в
+ плаващо. Вижте раздел
+ <link linkend="language.types.integer.casting">Преобразуване в цяло число</link>
+ за повече информация. От PHP 5, ще бъде хвърлено съобщение (notice), ако
опитате да превърнете обект в плаващо число.
</para>
+
</sect2>
+
+ <sect2 xml:id="language.types.float.comparison">
+ <title>Comparing floats</title>
+
+ <para>
+ As noted in the warning above, testing floating point values for equality is
+ problematic, due to the way that they are represented internally. However,
+ there are ways to make comparisons of floating point values that work around
+ these limitations.
+ </para>
+
+ <para>
+ To test floating point values for equality, an upper bound on the relative
+ error due to rounding is used. This value is known as the machine epsilon,
+ or unit roundoff, and is the smallest acceptable difference in calculations.
+ </para>
+
+ <informalexample>
+ <simpara>
+ <varname>$a</varname> and <varname>$b</varname> are equal to 5 digits of
+ precision.
+ </simpara>
+ <programlisting role="php">
+<![CDATA[
+<?php
+$a = 1.23456789;
+$b = 1.23456780;
+$epsilon = 0.00001;
+
+if(abs($a-$b) < $epsilon) {
+ echo "true";
+}
+?>
+]]>
+ </programlisting>
+ </informalexample>
+ </sect2>
+
+ <sect2 xml:id="language.types.float.nan">
+ <title>NaN</title>
+ <para>
+ Some numeric operations can result in a value represented by the constant
+ <constant>NAN</constant>. This result represents an undefined or
+ unrepresentable value in floating-point calculations. Any loose or strict
+ comparisons of this value against any other value, including itself, will
+ have a result of &false;.
+ </para>
+ <para>
+ Because <constant>NAN</constant> represents any number of different values,
+ <constant>NAN</constant> should not be compared to other values, including
+ itself, and instead should be checked for using <function>is_nan</function>.
+ </para>
+ </sect2>
</sect1>
<!-- Keep this comment at the end of the file