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