LabVIEWForum.de
Ungenauigkeit von Floatingpoint (allgemein) - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+--- Thema: Ungenauigkeit von Floatingpoint (allgemein) (/Thread-Ungenauigkeit-von-Floatingpoint-allgemein)

Seiten: 1 2


Ungenauigkeit von Floatingpoint (allgemein) - eMKay - 23.07.2010 10:18

Mir ist das Problem mit der Genauigkeit von Floatingpointzahlen per Zufall in einem Programm aufgefallen, da ich etwas mit einer Floatingpointzahl berechne und dann eine sehr kleine Zahl dazu addiere.

Das Bild beschreibt das Problem sehr anschaulich. Ich addiere einfach nur 0,1 und 0,2, aber das Ergebnis ist nicht 0,3 sondern 0,300000000000000044.
Die letzten beiden Stellen fallen den meisten wahrscheinlich gar nicht auf, aber ich brauche das exakte Ergebnis (0,3).

Der Support von NI konnte mir nicht wirklich dabei helfen.
http://floating-point-gui.de/formats/exact/

Ich habe keinen dieser Datentypen in Labview finden können aber ich kann mir nicht vorstellen, dass ich der einzige mit diesem Problem bin. Mit der Suche habe ich nichts zu dem Thema gefunden, aber vielleicht hat sich ja schon einmal jemand damit beschäftigt und weiß eine Lösung.


Ungenauigkeit von Floatingpoint (allgemein) - M Nussbaumer - 23.07.2010 10:29

Einer der Grundsätze in allen Programmiersprache ist:

Vergleiche NIEMALS eine Floatingpointzahl auf Gleichheit sondern immer auf grösser oder kleiner, aus eben erwähnter Problematik.
Eine Möglichkeit wäre den Wert mal 10^x (x=Stelle der benötigten Zahl) zu rechnen und einen Integer zu verwenden, da das Problem nur bei Kommazahlen besteht

Gruss MNussbaumer


Ungenauigkeit von Floatingpoint (allgemein) - SeBa - 23.07.2010 10:34

Erweiterte Genauigkeit...

[attachment=28136]


funzt/funzt nicht?



Gruß SeBa


Ungenauigkeit von Floatingpoint (allgemein) - jg - 23.07.2010 10:59

http://de.wikipedia.org/wiki/IEEE_754

Numerische Operationen für Gleitkommazahlen sind in einem Computer NIE genau! Es wird immer einen Fehler geben.
Ein grundsätzliches Problem ist z.B. das Addieren von einer "sehr großen" und einer "sehr kleinen" Zahl.
Oder vielfaches Addieren ein- und derselben Zahlen, da sich dort die Rundungsfehler addieren.

Ist so, war schon immer so, wird wahrscheinlich auch noch länger so bleiben.

Gruß, Jens


Ungenauigkeit von Floatingpoint (allgemein) - thomas.sandrisser - 23.07.2010 15:07

fuer lesefaule: http://floating-point-gui.de/
fuer streber: http://docs.sun.com/source/806-3568/ncg_goldberg.html


Ungenauigkeit von Floatingpoint (allgemein) - Lucki - 24.07.2010 10:24

Es gibt ja auch das neue Format "Festkomma" (FXP). Wer also seine Milliarden-Transaktionen auf dem Finanzmarkt immer auf den letzten Pfennig genau berechnen will und dazu Labview verwendet - mit diesem Formt liegt er richtig.

Bei Gleitkommazahlen muß die Frage, ob 0.1 + 0.2 = 0.3 ist, unter Berücksichtigung der Maschinentoleranz gestellt werden. Dann kommt duchaus ein "Ja" heraus - es ist aber umständlich immer so zu fragen:

[attachment=28150]


Ungenauigkeit von Floatingpoint (allgemein) - eMKay - 26.07.2010 12:04

' schrieb:Einer der Grundsätze in allen Programmiersprache ist:

Vergleiche NIEMALS eine Floatingpointzahl auf Gleichheit sondern immer auf grösser oder kleiner, aus eben erwähnter Problematik.
Eine Möglichkeit wäre den Wert mal 10^x (x=Stelle der benötigten Zahl) zu rechnen und einen Integer zu verwenden, da das Problem nur bei Kommazahlen besteht

Gruss MNussbaumer


Ich vergleiche die Zahlen nicht, aber ich muss eine sehr kleine Kommazahl und eine kleine Kommazahl addieren.
Die Werte brauche ich später auch wieder für weitere Berechnungen.
Wenn ich das alles mal 10^x nehme habe ich ja immernoch das Problem, dass ich es nachher wieder in eine Kommazahl zurück wandeln muss und dann stehe ich doch wieder vor dem selben Problem.


' schrieb:Erweiterte Genauigkeit...

[attachment=56919:Unbenann...11_33_03.png]
funzt/funzt nicht?
Gruß SeBa

Funktioniert leider nicht, das habe ich auch schon ausprobiert. Bei Dir scheint es ja merkwürdigerweise zu funktionieren.
Testweise hatte ich mal das Selbe programmiert, bekomme aber den gleichen Fehler wie vorher.


' schrieb:http://de.wikipedia.org/wiki/IEEE_754

Numerische Operationen für Gleitkommazahlen sind in einem Computer NIE genau! Es wird immer einen Fehler geben.
Ein grundsätzliches Problem ist z.B. das Addieren von einer "sehr großen" und einer "sehr kleinen" Zahl.
Oder vielfaches Addieren ein- und derselben Zahlen, da sich dort die Rundungsfehler addieren.

Ist so, war schon immer so, wird wahrscheinlich auch noch länger so bleiben.

Gruß, Jens


Da gibt es kein Weg dran vorbei? Es wird doch fast alles mit Computern berechnet, das kann ich mir nicht vorstellen. Taschenrechner bekommen es doch auch hin, es muss dazu doch eine Lösung in LabView gebenSad


' schrieb:fuer lesefaule: http://floating-point-gui.de/
fuer streber: http://docs.sun.com/source/806-3568/ncg_goldberg.html


Das ist ja der Link, den ich auch schon in meinem Ausgangsposting angegeben habe. Leider existieren, die dort erwähnten dezimalen Datentypen, die das Problem umgehen sollen nicht in LabView oder ich bin zu doof sie zu finden.

' schrieb:Es gibt ja auch das neue Format "Festkomma" (FXP). Wer also seine Milliarden-Transaktionen auf dem Finanzmarkt immer auf den letzten Pfennig genau berechnen will und dazu Labview verwendet - mit diesem Formt liegt er richtig.

Bei Gleitkommazahlen muß die Frage, ob 0.1 + 0.2 = 0.3 ist, unter Berücksichtigung der Maschinentoleranz gestellt werden. Dann kommt duchaus ein "Ja" heraus - es ist aber umständlich immer so zu fragen:

[attachment=56934:clip.png]


Das FXP Format hatte ich mir auch angesehen, aber das löst mein Problem leider auch nicht. Den Vergleich kann ich leider schlecht machen, da ich ja nicht weiß was für eine Zahl rauskommt, das soll ja berechnet werden.


Ungenauigkeit von Floatingpoint (allgemein) - GerdW - 26.07.2010 12:11

Hallo eMKay,

"Ich vergleiche die Zahlen nicht, aber ich muss eine sehr kleine Kommazahl und eine kleine Kommazahl addieren."
Um welche Werte (Größenordnungen) handelt es sich denn? Bisher hast du nur von 0.1 und 0.2 geschrieben...
Grundproblem:
Die Floatingpoint-Zahlen haben jeweils nur eine bestimmte Genauigkeit. Die beträgt bei DBL z.B. 53 bit oder auch ~16 Dezimalstellen. Liegen deine "sehr kleine" und "kleine" Zahl also 16 Zehnerpotenzen auseinander, gibt's Probleme (Rundungsfehler)...

"Leider existieren, die dort erwähnten dezimalen Datentypen, die das Problem umgehen sollen nicht in LabView oder ich bin zu doof sie zu finden."
Kennst du eine andere Programmiersprache, die diese dezimalen Datentypen von Haus aus unterstützt? Einen relativ neuen Standard, der bisher noch nicht von Hardware (d.h. CPU-Befehlen) unterstützt wird?
Alternativ kannst du ja Bibliotheken zum Rechnen mit "unbegrenzter" Genauigkeit einbinden. Der Aufwand dafür könnte aber erheblich sein...

Edit:
Nachtrag zu den CPU-Befehlen: beim 6502 konnte man in einen Dezimalmodus umschalten und dann "normale" Rechenbefehle (ADD, SUB) benutzen. Beim 68k gab's die ABCD/SBCD-Befehle zum Rechnen mit BinaryCodedDecimals. Kannst du natürlich in LabVIEW nachbauen - haben andere Leute mit den o.a. Bibliotheken ja auch schon gemacht...


Ungenauigkeit von Floatingpoint (allgemein) - jg - 26.07.2010 12:20

' schrieb:Ich vergleiche die Zahlen nicht, aber ich muss eine sehr kleine Kommazahl und eine kleine Kommazahl addieren.
s. Gerd
' schrieb:Da gibt es kein Weg dran vorbei? Es wird doch fast alles mit Computern berechnet, das kann ich mir nicht vorstellen.
DOCH, dem IST so!!!
' schrieb:Taschenrechner bekommen es doch auch hin, es muss dazu doch eine Lösung in LabView gebenSad
Dieser Vergleich hinkt bzw. ist nicht zulässig. Ein Taschenrechner rechnet anders als eine FPU eines Computers.
http://www.wer-weiss-was.de/theme50/article2510135.html

Gruß, Jens


Ungenauigkeit von Floatingpoint (allgemein) - SeBa - 26.07.2010 12:30

' schrieb:Funktioniert leider nicht, das habe ich auch schon ausprobiert. Bei Dir scheint es ja merkwürdigerweise zu funktionieren.
Testweise hatte ich mal das Selbe programmiert, bekomme aber den gleichen Fehler wie vorher.

Hast du auch alle Controlls neu erstellt oder nur die Darstellungsart auf EXT geändert? Das hat bei mir auch nicht funktioniert... also einfach mal frische EXT Controlls ins BD ziehen.


Gruß SeBa