Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Theoretische Informatik » Gleitkommazahlen IEEE754 Problem » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Gleitkommazahlen IEEE754 Problem
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
DrInf
unregistriert
Gleitkommazahlen IEEE754 Problem Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
06.11.2015 19:17
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
06.11.2015 19:56 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Theoretische Informatik » Gleitkommazahlen IEEE754 Problem