<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.types.float.php',
    1 => 'Gleitkommazahlen',
    2 => 'Gleitkommazahlen',
  ),
  'up' => 
  array (
    0 => 'language.types.php',
    1 => 'Typen',
  ),
  'prev' => 
  array (
    0 => 'language.types.integer.php',
    1 => 'Ganzzahlen (Integer)',
  ),
  'next' => 
  array (
    0 => 'language.types.string.php',
    1 => 'Strings (Zeichenketten)',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    '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">Gleitkommazahlen</h2>

 <p class="para">
  Gleitkommazahlen (auch als &quot;floats&quot;, &quot;doubles&quot; oder &quot;reelle Zahlen&quot;
  bezeichnet) können anhand einer der folgenden Schreibweisen bezeichnet
  werden:
 </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">// von PHP 7.4.0 an<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
  </div>

 </div>

 <p class="para">
  Formell von PHP 7.4.0 an (zuvor waren Unterstriche nicht erlaubt):
 </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">
  Die Größe einer Gleitkommazahl ist plattformabhängig, ein Maximalwert von
  circa 1.8e308 mit einer Präzision von ungefähr 14 Dezimal-Nachkommastellen
  ist jedoch ein üblicher Wert (64-Bit IEEE-Format).
 </p>

 <div class="warning"><strong class="warning">Warnung</strong>
  <h1 class="title">Genauigkeit von Gleitkommazahlen</h1>

  <p class="para">
   Gleitkommazahlen haben eine begrenzte Präzision. Obgleich dies vom System
   abhängig ist, verwendet PHP üblicherweise das IEEE 754 Double Precision
   Format, welches einen maximalen relativen Rundungsfehler in einer
   Größenordnung en 1.11e-16 ergibt. Nicht-Elementare arithmetische
   Operationen können jedoch größere Fehler hervorrufen und natürlich muss
   eine Fortpflanzung des Fehlers berücksichtigt werden, wenn mehrere
   Operationen zusammengesetzt werden.
  </p>

  <p class="para">
   Außerdem gibt es rationale Zahlen, die zur Basis 10 als Gleitkommazahlen
   exakt dargestellt werden können, beispielsweise <code class="literal">0.1</code> oder
   <code class="literal">0.7</code>, für die es aber keine exakte Repräsentation als
   Gleitkommazahlen zur Basis 2 gibt, welche intern aber unabhängig von der
   Größe der Mantisse verwendet wird. Daher können sie nicht ohne einen
   geringen Präzisionsverlust in ihre interne binäre Darstellung umgewandelt
   werden. Dies kann zu verwirrenden Ergebnissen führen:
   <code class="literal">floor((0.1+0.7)*10)</code> wird üblicherweise
   <code class="literal">7</code> ergeben statt des erwarteten Ergebnisses von
   <code class="literal">8</code>, da die interne Repräsentation etwas ist wie
   <code class="literal">7.9999999999999991118...</code>.
  </p>

  <p class="para">
   Man sollte sich daher niemals bis zur letzten Nachkommastelle auf
   Gleitkommazahlen verlassen und Gleitkommazahlen niemals direkt auf
   Gleichheit prüfen. Wenn eine höhere Präzision notwendig ist, stehen die
   <a href="ref.bc.php" class="link">Mathematikfunktionen mit beliebiger Präzision</a>
   und die <a href="ref.gmp.php" class="link">gmp</a>-Funktionen zur Verfügung.
  </p>

  <p class="para">
   Für eine &quot;einfache&quot; Erklärung steht der Ratgeber
   <a href="http://floating-point-gui.de/" class="link external">&raquo;&nbsp;Floating Point Guide</a>
   zur Verfügung, welcher auch den Titel hat &quot;Why don’t my numbers add up?&quot;
  </p>
 </div>

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

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

   <p class="simpara">
    Wenn der String
    <a href="language.types.numeric-strings.php" class="link">numerisch</a> ist oder
    numerisch beginnt, wird er in den entsprechenden Gleitkommawert
    umgewandelt, andernfalls wird er in Null (<code class="literal">0</code>)
    umgewandelt.
   </p>
  </div>

  <div class="sect3" id="language.types.float.casting.from-other">
   <h4 class="title">Von anderen Typen</h4>

   <p class="para">
    Werte aller anderen Typen werden umgewandelt, indem die Werte zuerst in den
    Typ <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> umgewandelt werden und dieser anschließend zu
    <span class="type"><a href="language.types.float.php" class="type float">float</a></span>. Weitere Informationen findet man unter
    <a href="language.types.integer.php#language.types.integer.casting" class="link">Umwandlung in Integer</a>.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Da bestimmte Typen ein undefiniertes Verhalten bei der Umwandlung in
     <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> haben, ist dies auch bei der Umwandlung in
     <span class="type"><a href="language.types.float.php" class="type float">float</a></span> der Fall.
    </p>
   </p></blockquote>
  </div>
 </div>

 <div class="sect2" id="language.types.float.comparison">
  <h3 class="title">Gleitkommazahlen vergleichen</h3>

  <p class="para">
   Wie in der obigen Warnung bereits dargestellt, ist es problematisch,
   Gleitkommazahlen auf Gleichheit zu überprüfen, aufgrund ihrer internen
   Darstellungsart. Es gibt allerdings Wege, diese Vergleiche von
   Gleitkommazahlen anzustellen, die diese Beschränkungen umgehen.
  </p>

  <p class="para">
   Um Gleitkommazahlen auf Gleichheit zu prüfen, wird eine obere Schranke für
   den Rundungsfehler verwendet. Dieser Wert ist bekannt als
   Maschinengenauigkeit Epsilon und stellt die kleinste annehmbare Differenz
   in der Berechnung dar.
  </p>

  <p class="para">
   <var class="varname">$a</var> und <var class="varname">$b</var> sind bis auf 5
   Nachkommastellen gleich.
  </p>

  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Vergleichen von Gleitkommazahlen</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">
   Einige numerische Operationen können einen Wert ergeben, der durch die
   Konstante <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> dargestellt wird. Dieses Ergebnis
   stellt einen undefinierten oder nicht darstellbaren Wert in den
   Fließkommaberechnungen dar. Jeder strikte oder nicht strikte Vergleich
   dieses Werts mit jedem beliebigen anderen Wert, inklusive sich selbst, nur
   nicht <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, wird ein Ergebnis von <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> hervorbringen.
  </p>
  <p class="para">
   Da <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> eine beliebige Anzahl von anderen Werten
   darstellen kann, sollte <strong><code><a href="math.constants.php#constant.nan">NAN</a></code></strong> nicht mit anderen Werten,
   einschließlich sich selbst, verglichen werden. Stattdessen sollte zur
   Prüfung <span class="function"><a href="function.is-nan.php" class="function">is_nan()</a></span> verwendet werden.
  </p>
 </div>
</div><?php manual_footer($setup); ?>