phpbar.de logo

Mailinglisten-Archive

[php] Bug oder Rechenfehler?

[php] Bug oder Rechenfehler?

Mathias Gloss mgloss at amadeus.net
Fre Dez 12 10:37:57 CET 2003


Aloha,

ich hoffe mal, daß mich niemand steinigt..... das ist die erste Mail an 
eine Mailingliste mit Lotus Notes (zwangsweise :-(



>Marco Döhring wrote:

>>"Es ist ziemlich normal, dass einfache Dezimalzahlen wie 0.1 oder 0.7 
nicht in ihre internen
>>binären Entsprechungen konvertiert werden können, ohne einen kleinen 
Teil ihrer Genauigkeit
>>zu verlieren. Das kann zu verwirrenden Ergebnissen führen. So wird 
floor((0.1 + 0.7) * 10)
>>normalerweise 7 statt des erwarteten Wertes 8 zurück geben (als Ergebnis 
der internen
>>Entsprechung von 7.9999999999.... [...]"

>Das erklärt das Phänomen. Und wie die Antwort von Sebastian Tobias 
>bereits erklärt ist das in (fast ?) allen Programmiersprachen zu finden. 
>Jedoch würde ich einen Wert wie -0.001 oder ähnliches erwarten.

Warum?

(Übliche) Computer kennen nur binäre Zahlen. Um damit Ganze 
Zahlen darstellen zu können, wird z.B. eine 10 zu
1 x 2^3 (8)
0 x 2^2 (4)
1 x 2^1 (2)
0 x 2^0 (1)

Also binär 1010. Soweit ist das noch recht einfach und genau.
Die Nachkommastellen werden jedoch als Brüche berechnet. Z.b.
bei 0,75:

1 x 2^-1 (1/2)
1 x 2^-2 (1/4)

Also wäre z.B. 10,75 so etwas in der Form:
1010,11

Wie man leicht sieht, sind nachkommastellen, die sich nicht
aus den Werten 0,5; 0,25; 0,125; .... zusammensetzen lassen,
schon gar nicht mehr genau darstellbar, sondern müssen ge-
rundet werden. Auch wenn sie im Dezimalsystem leicht dar-
stellbar sind (wie z.B. 0,1)



Viele Grüße, Mathias






-- 
** Allgemeine deutschsprachige PHP-Liste: php at phpbar.de **
Informationen: http://www.phpbar.de
http://lists.phpbar.de/mailman/listinfo/php





php::bar PHP Wiki   -   Listenarchive