[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]

Subject: Re: libm bug oder bin ich bloed
From: Christian Stieber
Date: 26 Aug 1999 08:38:43 -0000


On Thu, Aug 26, 1999 at 09:48:07AM +0200, Daniel Schreiber wrote:

> kommt heraus, dass 0.83*100=82.999998 
> Ist doch irgendwie eigenartig, oder?

Nein. Fließkommazahlen werden im 2er System dargestellt; Du bist das
10er System gewohnt. Das bedeutet daß Fließkommazahlen nur genau dargestellt
werden können wenn sie sich als Summe von Zweierpotenzen schreiben lassen:
0.5 ist 1/2^1 --- paßt. 0.4 geht schon nicht mehr. Für Zahlen im 10er
System gilt ähnliches, nur haben wir hier die Primfaktoren 2 und 5 ---
man kann also alles was sich im Zweiersystem (Primfaktoren 2) darstellen
läßt auch im Zehnersystem darstellen, aber nicht umgekehrt.

Die Folge daraus ist daß Fließkommazahlen zusätzliche Ungenauigkeiten
einführen --- weshalb man Fließkommazahlen beispielsweise nicht für
Geldbeträge verwenden kann. Stattdessen rechnen wir beispielsweise
mit 128 Bit Integers in "Millionstel Pfennigen" oder so in der Art.

>       if(i==int(value*100))

Sowas ist sehr gefährlich, zumal da es auch noch andere Quellen für
Ungenauigkeiten gibt (z.B. Fließkommaregister vs. Speicher). Besser
ist es statt "a<b" etwas in der Art von "fabs(a-b)<e" zu verwenden,
wobei "e" ein kleiner Wert ist der gewissermaßen den erlaubten
"Ungenauigkeitsbereich" festlegt.

> Was kann man gegen diesen Bug machen?

Eine Einführung in die Numerik lesen :-)

Allgemein gilt: Floats in Evil, und man sollte sich wirklich Gedanken
darüber machen ob man sie tatsächlich verwenden will.

Christian