<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.types.float.php',
    1 => 'Nombres &agrave; virgule flottante',
    2 => 'Nombres &agrave; virgule flottante',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Les types',
  ),
  'prev' => 
  array (
    0 => 'language.types.integer.php',
    1 => 'Les entiers',
  ),
  'next' => 
  array (
    0 => 'language.types.string.php',
    1 => 'Cha&icirc;nes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Nombres à virgule flottante</h2>
 
 <p class="para">
  Les nombres à virgule flottante (aussi connus comme <code class="literal">&quot;floats&quot;</code>,
  <code class="literal">&quot;doubles&quot;</code>, ou <code class="literal">&quot;nombres réels&quot;</code>)
  peuvent être spécifiés en utilisant les syntaxes suivantes :
 </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">// à partir de PHP 7.4.0<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>
 
 <p class="para">
  Formellement à partir de PHP 7.4.0 (auparavant, les underscores n&#039;étaient
  pas autorisés) :
 </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">
  La taille d&#039;un <a href="language.types.float.php" class="link">nombre décimal</a> est dépendante de la plate-forme, cependant,
  un nombre maximal d&#039;environ 1.8e308 avec une précision sur 14 chiffres est
  une valeur commune (format 64 bits IEEE).
 </p>
 
 <div class="warning"><strong class="warning">Avertissement</strong>
  <h1 class="title">Précision des nombres flottants</h1>
  
  <p class="para">
   Les nombres flottants ont une précision limitée. Même s&#039;ils dépendent du système,
   PHP utilise le format de précision des décimaux IEEE 754, qui donnera une erreur
   maximale relative de l&#039;ordre de 1.11e-16 (due aux arrondis). Les opérations
   arithmétiques non-élémentaires peuvent donner des erreurs plus importantes et
   bien sûr les erreurs doivent être prises en compte lorsque plusieurs opérations
   sont liées.
  </p>
  
  <p class="para">
   Aussi, les nombres rationnels exactement représentables sous forme de nombre à virgule
   flottante en base 10, comme <code class="literal">0.1</code> ou <code class="literal">0.7</code>, n&#039;ont pas
   de représentation exacte comme nombres à virgule flottante en base 2, utilisée en
   interne, et ce quelle que soit la taille de la mantisse. De ce fait, ils ne peuvent
   être convertis sans une petite perte de précision. Ceci peut mener à des résultats
   confus: par exemple, <code class="literal">floor((0.1+0.7)*10)</code> retournera normalement
   <code class="literal">7</code> au lieu de <code class="literal">8</code> attendu, car la représentation
   interne sera quelque chose comme <code class="literal">7.9999999999999991118...</code>.
  </p>
  
  <p class="para">
   Ainsi, il ne faut jamais faire confiance aux derniers chiffres d&#039;un nombre
   flottant, et il ne faut pas non plus comparer l&#039;égalité de 2 nombres flottants
   directement. Si une plus grande précision est nécessaire, les
   <a href="ref.bc.php" class="link">fonctions mathématiques de précision arbitraire</a>
   et les fonctions <a href="ref.gmp.php" class="link">gmp</a> sont disponibles.
  </p>
  
  <p class="para">
   Pour une explication &quot;simple&quot;, voir le
   <a href="http://floating-point-gui.de/" class="link external">&raquo;&nbsp;guide relatif aux nombres
    à virgule flottante</a> qui est aussi intitulé
   &quot;Why don&#039;t my numbers add up?&quot;
  </p>
  
 </div>

 <div class="sect2" id="language.types.float.casting">
  <h3 class="title">Convertir en un nombre flottant</h3>

  <div class="sect3" id="language.types.float.casting.from-string">
   <h4 class="title">Depuis des chaînes de caractères</h4>

   <p class="simpara">
    Si une chaîne est
    <a href="language.types.numeric-strings.php" class="link">numérique</a>
    ou numérique de tête alors elle sera transformée en sa valeur flottante
    correspondante, sinon elle sera convertie en zéro (<code class="literal">0</code>).
   </p>
  </div>

  <div class="sect3" id="language.types.float.casting.from-other">
   <h4 class="title">Depuis d&#039;autres types</h4>

   <p class="para">
    Pour les valeurs d&#039;autres types, la conversion est effectuée en convertissant
    la valeur d&#039;abord en <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> puis en <span class="type"><a href="language.types.float.php" class="type float">float</a></span>. Voir
    <a href="language.types.integer.php#language.types.integer.casting" class="link">conversion en entier</a>
    pour plus d&#039;informations.
   </p>

   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     Comme certains types ont un comportement indéfini lors de la conversion
     en <span class="type"><a href="language.types.integer.php" class="type int">int</a></span>, ceci est aussi le cas lors de la conversion 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">Comparaison de nombres flottants</h3>
  
  <p class="para">
   Comme dit dans la note ci-dessus, le test d&#039;égalité des valeurs de
   nombres flottants est problématique, en raison de la façon dont ils
   sont représentés en interne. Cependant, il existe des façons de
   réaliser cette comparaison.
  </p>
  
  <p class="para">
   Pour tester l&#039;égalité de valeurs de nombres flottants, une borne supérieure
   de l&#039;erreur relative à l&#039;arrondi est utilisée. Cette valeur est connue
   comme étant l&#039;epsilon de la machine, ou le <code class="literal">unit roundoff</code>,
   et est la différence la plus petite acceptable dans les calculs.
  </p>

  <p class="para">
   <var class="varname">$a</var> et <var class="varname">$b</var> sont égaux sur 5 nombres
   après la virgule.
  </p>
  
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Comparaison de nombres flottants</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">
   Quelques opérations numériques peuvent donner comme résultat une valeur
   représentée par la constante <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong>. Ce résultat représente
   une valeur indéfinie ou non représentable lors de calculs avec des nombres
   à virgule flottante. Toute comparaison, même stricte de cette valeur avec
   une autre valeur, y compris cette constante elle-même, sauf si elle est
   égale à <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, donnera une valeur de <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </p>
  <p class="para">
   En raison du fait que <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> représente tout nombre de valeurs
   différentes, <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> ne devrait pas être comparé à d&#039;autres valeurs,
   y compris cette constante elle-même, et à la place, devrait être vérifié
   en utilisant la fonction <span class="function"><a href="function.is-nan.php" class="function">is_nan()</a></span>.
  </p>
 </div>
</div><?php manual_footer($setup); ?>