Zahlen¶
Bei der Verwendung von Zahlen in Computersystemen sind einige Besonderheiten zu beachten, die in diesem Artikel kurz dargestellt werden. Im Anhang sind Links auf ausführlichere Dokumentationen genannt.
Floats¶
Gleitkommazahlen haben in EDV-Systemen eine begrenze Genauigkeit und können, bei Anwendern die mit der Problematik nicht
vertraut sind, zu unerwarteten Ergebnissen führen. Der folgende Code wird in den meisten Fällen 7 und nicht 8 zurückgeben.
Dies hat damit zu tun, das die interne Darstellung im System nicht 8
, sondern 7.9999999999999991118....
entspricht.
Bei der Verwendung von Gleitkommaarithmetik für die Berechnung von Geldbeträgen, können schnell ein paar Euro fehlen.
$float = floor((0.1+0.7)*10);
echo $float; // 7
Genauigkeit¶
Die interne Genauigkeit hängt vom System ab und liegt in der Regel bei 14 Stellen. Die gewünschte Genauigkeit kann in PHP über die Konfigurationseinstellung precision eingestellt werden.
precision=14
In den folgenden Beispiel wird eine Gleitkommazahl mit unterschiedlicher Genauigkeit betrachtet. Man sieht recht gut, das eine Erhöhung der Genauigkeit zu Problemen führen kann. Die Gründe hierzu können in dem Wikipedia-Artikel über Gleitkommazahlen nachgelesen werden.
\ini_set('precision', 14);
$float = 24.6;
echo $float; // 24.6
\ini_set('precision', 20);
$float = 24.6;
echo $float; // 24.600000000000001421
Integer¶
In der folgenden Tabelle sind die Repräsentationen von Ganzzahlen in einem 32bit PHP-System dargestellt. Mann erkennt ganz gut das das erste Bit für das Vorzeichen verwendet wird. Die maximal darstellbare ganzzahlige Zahl hängt von der Systemarchitektur ab und kann über Konstante PHP_INT_MAX abgefragt werden. Die Konstante PHP_INT_SIZE liefert die Anzahl der Bytes, die zur Speicherung der Zahlen verwendet werden.
Darstellung im Zahlenraum¶
Ausgangszahl | Binäre Darstellung | Umwandlung in Dezimal (bindec) | Bemerkung |
---|---|---|---|
1073741823 | 00111111111111111111111111111111 | 1073741823 | |
1073741824 | 01000000000000000000000000000000 | 1073741824 | Überlauf |
2147483647 | 01111111111111111111111111111111 | 2147483647 | entspricht PHP_INT_MAX |
-1 | 11111111111111111111111111111111 | 4294967295 | Größte Binärzahl |
-100 | 11111111111111111111111110011100 | 4294967196 | |
-2147483648 | 10000000000000000000000000000000 | 2147483648 | über ~PHP_INT_MAX |
Dieses Wissen ist auch für die Arbeit mit großen Zahlen wichtig. Definiert man zum Beispiel auf einem 64bit System
$int = 9999999999999999999;
echo $int; // 1.0E+19
so definiert man kein Integer, sondern einen Wert vom Typ Float. Verwendet man bei der Zuweisung allerdings eine explizite Typumwandlung (cast), so wird der Wert auf einen Integer "gekürzt".
$int = (int) 9999999999999999999;
echo $int; // -8446744073709551616
GMP¶
Eine Möglichkeit mit sehr großen Zahlen zu arbeiten, bietet die Erweiterung GNU Multiple Precision (gmp). Mit gmp ist es Möglich auch sehr große Werte zu verarbeiten.
$int = gmp_init("9999999999999999999");
$intString = gmp_strval($int);
var_dump($int, $intString); // resource(4) of type (GMP integer) string(19) "9999999999999999999"