<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.types.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'language.types.float.php',
    1 => 'N&uacute;meros de punto flotante',
    2 => 'N&uacute;meros de punto flotante',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Los tipos',
  ),
  'prev' => 
  array (
    0 => 'language.types.integer.php',
    1 => 'Los enteros',
  ),
  'next' => 
  array (
    0 => 'language.types.string.php',
    1 => 'Cadenas',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'language/types/float.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.types.float" class="sect1">
 <h2 class="title">Números de punto flotante</h2>

 <p class="para">
  Los números de punto flotante (también conocidos como &quot;floats&quot;,
  &quot;doubles&quot; o &quot;números reales&quot;)
  pueden ser especificados utilizando las siguientes sintaxis:
 </p>

 <div class="informalexample">
  <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1.234</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">1.2e3</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">7E-10</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$d </span><span style="color: #007700">= </span><span style="color: #0000BB">1_234.567</span><span style="color: #007700">; </span><span style="color: #FF8000">// a partir de PHP 7.4.0<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <p class="para">
  Formalmente a partir de PHP 7.4.0 (anteriormente, los guiones bajos no estaban permitidos):
 </p>

 <div class="informalexample">
  <div class="example-contents">
<div class="annotation-interactive cdata"><pre>
LNUM          [0-9]+(_[0-9]+)*
DNUM          ({LNUM}?&quot;.&quot;{LNUM}) | ({LNUM}&quot;.&quot;{LNUM}?)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
</pre></div>
  </div>

 </div>

 <p class="para">
  El tamaño de un <span class="type"><a href="language.types.float.php" class="type float">float</a></span> depende de la plataforma, sin embargo,
  un número máximo de aproximadamente 1.8e308 con una precisión de 14 dígitos es
  un valor común (formato de 64 bits IEEE).
 </p>

 <div class="warning"><strong class="warning">Advertencia</strong>
  <h1 class="title">Precisión de los números de punto flotante</h1>

  <p class="para">
   Los números de punto flotante tienen una precisión limitada. Aunque dependen del sistema,
   PHP utiliza el formato de precisión decimal IEEE 754, que dará un error relativo máximo del orden de 1.11e-16 (debido a los redondeos). Las operaciones
   aritméticas no elementales pueden dar errores más grandes y, por supuesto, los errores deben ser tenidos en cuenta cuando se realizan múltiples operaciones.
  </p>

  <p class="para">
   Asimismo, los números racionales exactamente representables como números de punto flotante en base 10, como <code class="literal">0.1</code> o <code class="literal">0.7</code>, no tienen
   una representación exacta como números de punto flotante en base 2, utilizada internamente, y esto independientemente del tamaño de la mantisa. Por lo tanto, no pueden
   ser convertidos sin una pequeña pérdida de precisión. Esto puede llevar a resultados confusos: por ejemplo, <code class="literal">floor((0.1+0.7)*10)</code> normalmente devolverá
   <code class="literal">7</code> en lugar del <code class="literal">8</code> esperado, ya que la representación interna será algo como <code class="literal">7.9999999999999991118...</code>.
  </p>

  <p class="para">
   Por lo tanto, nunca se debe confiar en los últimos dígitos de un número
   de punto flotante, y tampoco se debe comparar la igualdad de 2 números de punto flotante
   directamente. Si se necesita una mayor precisión, las
   <a href="ref.bc.php" class="link">funciones matemáticas de precisión arbitraria</a>
   y las funciones <a href="ref.gmp.php" class="link">gmp</a> están disponibles.
  </p>

  <p class="para">
   Para una explicación &quot;simple&quot;, ver el
   <a href="http://floating-point-gui.de/" class="link external">&raquo;&nbsp;guía relativa a los números
    de punto flotante</a>.
  </p>

 </div>

 <div class="sect2" id="language.types.float.casting">
  <h3 class="title">Convertir a un número de punto flotante</h3>

  <div class="sect3" id="language.types.float.casting.from-string">
   <h4 class="title">Desde cadenas de caracteres</h4>

   <p class="simpara">
    Si una cadena es
    <a href="language.types.numeric-strings.php" class="link">numérica</a>
    o numérica de cabeza entonces será transformada en su valor de punto flotante
    correspondiente, de lo contrario será convertida a cero(<code class="literal">0</code>).
   </p>
  </div>

  <div class="sect3" id="language.types.float.casting.from-other">
   <h4 class="title">Desde otros tipos</h4>

   <p class="para">
    Para los valores de otros tipos, la conversión se realiza convirtiendo
    el valor primero en <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> y luego en <span class="type"><a href="language.types.float.php" class="type float">float</a></span>. Ver
    <a href="language.types.integer.php#language.types.integer.casting" class="link">conversión a entero</a>
    para más información.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Como algunos tipos tienen un comportamiento indefinido al convertirse
     en <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, esto también es el caso al convertirse en
     <span class="type"><a href="language.types.float.php" class="type float">float</a></span>.
    </p>
   </p></blockquote>
  </div>
 </div>

 <div class="sect2" id="language.types.float.comparison">
  <h3 class="title">Comparación de números de punto flotante</h3>

  <p class="para">
   Como se mencionó anteriormente, la prueba de igualdad de valores de
   números de punto flotante es problemática, debido a la forma en que se representan internamente. Sin embargo, existen formas de
   realizar esta comparación.
  </p>

  <p class="para">
   Para probar la igualdad de valores de números de punto flotante, se utiliza un límite superior del error relativo al redondeo. Este valor es conocido
   como el epsilon de la máquina, o unit roundoff,
   y es la diferencia más pequeña aceptable en los cálculos.
  </p>

  <p class="para">
   <var class="varname">$a</var> y <var class="varname">$b</var> son iguales en 5 números
   después de la coma.
  </p>

  <div class="example" id="example-1">
   <p><strong>Ejemplo #1 Comparación de números de punto flotante</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1.23456789</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">1.23456780</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$epsilon </span><span style="color: #007700">= </span><span style="color: #0000BB">0.00001</span><span style="color: #007700">;<br /><br />if( </span><span style="color: #0000BB">abs</span><span style="color: #007700">(</span><span style="color: #0000BB">$a </span><span style="color: #007700">- </span><span style="color: #0000BB">$b</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">$epsilon</span><span style="color: #007700">) {<br />    echo </span><span style="color: #DD0000">"true"</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div>

 <div class="sect2" id="language.types.float.nan">
  <h3 class="title">NaN</h3>
  <p class="para">
   Algunas operaciones numéricas pueden dar como resultado un valor
   representado por la constante <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong>. Este resultado representa
   un valor indefinido o no representable en cálculos con números de punto flotante. Cualquier comparación, incluso estricta de este valor con
   otro valor, incluyendo esta constante misma, excepto si es igual a <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, dará un valor de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
  <p class="para">
   Debido a que <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> representa cualquier número de valores
   diferentes, <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> no debe ser comparado con otros valores,
   incluyendo esta constante misma, y en su lugar, debe ser verificado
   utilizando la función <span class="function"><a href="function.is-nan.php" class="function">is_nan()</a></span>.
  </p>
 </div>

</div><?php manual_footer($setup); ?>