<?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 => 'it',
  ),
  'this' => 
  array (
    0 => 'language.types.float.php',
    1 => 'Numeri floating point',
    2 => 'Numeri floating point',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Tipi di dati',
  ),
  'prev' => 
  array (
    0 => 'language.types.integer.php',
    1 => 'Interi',
  ),
  'next' => 
  array (
    0 => 'language.types.string.php',
    1 => 'Strings',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    '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">Numeri floating point</h2>

 <p class="para">
  I valori floating point (anche conosciuti come &quot;float&quot;, &quot;double&quot;, o &quot;numeri reali&quot;)
  possono essere specificati utilizzando una delle seguenti sintassi:
 </p>

 <div class="informalexample">
  <div class="example-contents">
<div class="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 partire da PHP 7.4.0<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <p class="para">
  Formalmente a partire da PHP 7.4.0 (in precedenza, i trattini bassi non erano consentiti):
 </p>

 <div class="informalexample">
  <div class="example-contents">
<div class="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">
  La dimensione di una variabile float dipende dalla piattaforma in uso, sebbene un massimo di circa 1.8e308
  con una precisione di circa 14 cifre decimali sia il valore comune (il formato a 64 bit
  IEEE).
 </p>

 <div class="warning"><strong class="warning">Avviso</strong>
  <h1 class="title">Precisione di un valore floating point</h1>

  <p class="para">
   I numeri floating point hanno una precisione limitata. Nonostante questa dipenda dal
   sistema in uso. PHP tipicamente utilizza il formato IEEE 754 double-precision, il quale
   pone un errore relativo massimo causato dall&#039;arrotondamento nell&#039;ordine di 1.11e-16.
   Operazioni aritmetiche non elementari possono restituire un errore maggiore e, di conseguenza,
   la propagazione dell&#039;errore deve essere considerata quando più operazioni vengono eseguite
   in successione.
  </p>
  
  <p class="para">
   In più, alcuni numeri razionali che sono esattamente rappresentabili come numeri
   floating point in base 10, ad esempio <code class="literal">0.1</code> o
   <code class="literal">0.7</code>), non hanno, al contrario, una rappresentazione come numeri
   floating point in base 2, la quale viene utilizzata internamente dal sistema, indipendentemente dalla dimensione
   della mantissa. Dunque, questi non possono essere convertiti nella loro controparte binaria
   interna senza una piccola perdita di precisione. Ciò può portare a risultati
   confusionari: per esempio, <code class="literal">floor((0.1+0.7)*10)</code> solitamente
   ritornerà come risultato <code class="literal">7</code> invece di <code class="literal">8</code>,
   in quanto la sua rappresentazione interna sarà qualcosa di simile a
   <code class="literal">7.9999999999999991118...</code>.
  </p>

  <p class="para">
   Perciò non fate mai affidamento sui risultati numerici decimali sino all&#039;ultima cifra e non comparate 
   numeri floating point direttamente per uguaglianza. Se è necessaria una maggior
   precisione, sono disponibili le <a href="ref.bc.php" class="link">funzioni matematiche con precisione arbitraria</a>
   e le funzioni <a href="ref.gmp.php" class="link">gmp</a>.
  </p>
  
  <p class="para">
   Per una &quot;semplice&quot; spiegazione, vedere la <a href="http://floating-point-gui.de/" class="link external">&raquo;&nbsp;guida per floating point</a>,
   la quale è anche intitolata &quot;Why don’t my numbers add up?&quot;
  </p>
 </div>

 <div class="sect2" id="language.types.float.casting">
  <h3 class="title">Conversione a float</h3>

  <div class="sect3" id="language.types.float.casting.from-string">
   <h4 class="title">Da stringhe</h4>

   <p class="simpara">
    Se la stringa è
    <a href="language.types.numeric-strings.php" class="link">numerica</a>
    o inizia con un numero, verrà risolta nel
    valore float corrispondente, altrimenti verrà convertita in zero
    (<code class="literal">0</code>).
   </p>
  </div>

  <div class="sect3" id="language.types.float.casting.from-other">
   <h4 class="title">Da altri tipi</h4>

   <p class="para">
    Per i valori di altri tipi, la conversione viene eseguita convertendo il
    valore prima in <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> e poi in <span class="type"><a href="language.types.float.php" class="type float">float</a></span>. Vedere
    <a href="language.types.integer.php#language.types.integer.casting" class="link">Conversione in numero intero</a>
    per ulteriori informazioni.
   </p>

   <blockquote class="note"><p><strong class="note">Nota</strong>: 
    <p class="para">
     Poiché alcuni tipi hanno un comportamento indefinito durante la conversione in
     <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, lo stesso vale durante la conversione in
     <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">Comparare float</h3>

  <p class="para">
   Come fatto notare nell&#039;esempio sopra, comparare valori floating point per uguaglianza potrebbe risultare
   problematico a causa della loro rappresentazione interna. Tuttavia
   esistono dei metodi per comparare dei valori floating point che aggirano
   queste limitazioni.
  </p>

  <p class="para">
   Per confrontare valori floating point per uguaglianza viene scelto un limite superiore all&#039;errore
   relativo creato dall&#039;arrotondamento. Questo valore è conosciuto come la macchina epsilon,
   o unità roundoff, ed è la più piccola differenza accettabile nel calcolo.
  </p>
  
  <div class="informalexample">
   <p class="simpara">
    <var class="varname">$a</var> e <var class="varname">$b</var> sono uguali per 5 cifre di
    precisione.
   </p>
   <div class="example-contents">
<div class="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">
   Alcune operazioni possono ritornare un valore rappresentato dalla costante
   <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong>. Questo risultato rappresenta un valore indefinito o
   non presentabile nei calcoli di numeri floating point. Qualsiasi comparazione
   per uguaglianza o per identicità di questo valore con qualsiasi altro, incluso sé stesso,
   risulterà <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
  <p class="para">
   Poiché <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> rappresenta un qualsiasi numero di differenti valori,
   <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> non dovrebbe essere comparato ad altri valori, incluso
   se stesso, e dovrebbe invece essere verificato tramite la funzione <span class="function"><a href="function.is-nan.php" class="function">is_nan()</a></span>.
  </p>
 </div>
</div><?php manual_footer($setup); ?>