Gleitkommazahlen IEEE754 Problem

Neue Frage »

Auf diesen Beitrag antworten »
DrInf Gleitkommazahlen IEEE754 Problem

Meine Frage:
Hallihallo,
ich sitze momentan an folgender Aufgabe:
Gleitkommazahlen: In Java und C funktionieren die arithmetischen Vergleichsoperationen
wie <, <=, >, >= sowie == und != wie erwartet.
(a) Warum ist der direkte Vergleich zweier (auf unterschiedlichen Wegen berechneten) Gleitkommazahlen mittels

double a = ...
double b = ...
if (a == b) { ... } else { ... }

trotzdem keine gute Idee?

(b) Etwas besser ist der folgende Ansatz:

final double EPSILON = ... // z.B. 0.000001
double a = ...
double b = ...
if (Math.abs( a - b ) < EPSILON)
{ ... } // almost equal
else
{ ... } // not equal

Begründen Sie, wie Sie abhängig von den Wertebereichen der Variablen a und b sowie der
erreichbaren Genauigkeit (hier Datentyp double) einen geeigneten Wert von [latex] \epsilon [/latex] wählen.
Dabei sind die von der Anwendung her erreichbaren Genauigkeiten zu berücksichtigen. Zum
Beispiel sind mit einem Zollstock gemessene Längen vielleicht nur auf einen halben Millimeter
genau, mit einer Mikrometerschraube gemessene Dicken eines Blechs auf einen Mikrometer,
und Entfernungsangaben auf Straßenschildern vielleicht auf [latex]\pm 1km [/latex] genau.



Meine Ideen:
Nun ist Aufgabe a wirklich kein Problem, warum man die Gleichheit von Gleitkommazahlen nicht auf diesem Wege abfragen darf (Periodizität der Binärzahl usw.) Ich habe diesen Aufgabenteil nur gepostet, damit das Problem klar wird, um das sich Teilaufgabe b) handelt.
Bei b) verstehe ich einfach nicht, worauf hinausgearbeitet werden soll. Ich sehe, dass wenn ich zwei Zahlen voneinander abziehe und die Differenz wie im Beispiel kleiner als 0.000001 ist, die beiden Zahlenwerte dann als gleich angesehen werden dürfen, da es sich dann wahrscheinlich nur um einen Rundungsfehler handelt und nicht um eine tatsächlich andere Zahl.
Wie soll ich hier verfahren bzw. woher soll ich wissen, welches Epsilon ich für gemessene Längen eines Zollstocks verwenden soll? Kann mir da vielleicht jemand weiterhelfen?
Ich wäre sehr dankbar für jeglichen Tipp! smile
 
Auf diesen Beitrag antworten »
eulerscheZahl

Mir gefällt die Frage nicht:
da es sich um Gleitpunktzahlen handelt, gibt es da sehr viel Spiel, je nachdem, ob du mit sehr großen oder sehr kleinen Zahlen arbeitest, muss auch das epsilon angepasst werden. Die Frage lässt sich also nicht allgemein beantworten, es kommt immer auf den Anwendungsfall an.

Du könntest die Zahlen ins Verhältnis setzen, um das zu umgehen (Achtung bei b=0):
code:
1:
if (Math.abs(1 - a/b) < 1e-12) ...

double hat eine Genauigkeit von etwa 15 Dezimalziffern.

In der konkreten Anwendung wird sich aber meist auch ein sinnvoller Wert für epsilon finden.
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »