INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Ungenauigkeit von Floatingpoint (allgemein)



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

23.07.2010, 10:18
Beitrag #1

eMKay Offline
LVF-Grünschnabel
*


Beiträge: 33
Registriert seit: Jul 2010

8.6 Student
2009
de


Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
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.


Angehängte Datei(en) Thumbnail(s)
   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
23.07.2010, 10:29
Beitrag #2

M Nussbaumer Offline
Zarathustra
****


Beiträge: 654
Registriert seit: Sep 2009

2009 SP1
2009
EN

6300
Schweiz
Ungenauigkeit von Floatingpoint (allgemein)
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
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.07.2010, 10:34
Beitrag #3

SeBa Offline
LVF-Guru
*****


Beiträge: 2.025
Registriert seit: Oct 2008

09SP1 & 10 FDS
2008
DE

65xxx
Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
Erweiterte Genauigkeit...

   


funzt/funzt nicht?



Gruß SeBa

Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.

Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.

Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.07.2010, 10:59 (Dieser Beitrag wurde zuletzt bearbeitet: 23.07.2010 11:02 von jg.)
Beitrag #4

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
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

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
23.07.2010, 15:07
Beitrag #5

thomas.sandrisser Offline
LVF-SeniorMod


Beiträge: 1.298
Registriert seit: Sep 2005

xxxx
2005
EN

78759
United States
Ungenauigkeit von Floatingpoint (allgemein)
fuer lesefaule: http://floating-point-gui.de/
fuer streber: http://docs.sun.com/source/806-3568/ncg_goldberg.html
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
24.07.2010, 10:24 (Dieser Beitrag wurde zuletzt bearbeitet: 24.07.2010 10:58 von Lucki.)
Beitrag #6

Lucki Offline
Tech.Exp.2.Klasse
LVF-Team

Beiträge: 7.699
Registriert seit: Mar 2006

LV 2016-18 prof.
1995
DE

01108
Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
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:

   
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
26.07.2010, 12:04
Beitrag #7

eMKay Offline
LVF-Grünschnabel
*


Beiträge: 33
Registriert seit: Jul 2010

8.6 Student
2009
de


Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
' 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.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.07.2010, 12:11 (Dieser Beitrag wurde zuletzt bearbeitet: 26.07.2010 12:27 von GerdW.)
Beitrag #8

GerdW Offline
______________
LVF-Team

Beiträge: 17.480
Registriert seit: May 2009

LV2021
1995
DE_EN

10×××
Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
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...

Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.07.2010, 12:20
Beitrag #9

jg Offline
CLA & CLED
LVF-Team

Beiträge: 15.864
Registriert seit: Jun 2005

20xx / 8.x
1999
EN

Franken...
Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
' 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

Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)

!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!

Einführende Links zu LabVIEW, s. GerdWs Signatur.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
26.07.2010, 12:30
Beitrag #10

SeBa Offline
LVF-Guru
*****


Beiträge: 2.025
Registriert seit: Oct 2008

09SP1 & 10 FDS
2008
DE

65xxx
Deutschland
Ungenauigkeit von Floatingpoint (allgemein)
' 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

Dieser Beitrag soll weder nützlich, informativ noch lesbar sein.

Er erhebt lediglich den Anspruch dort wo er ungenau ist, wenigstens eindeutig ungenau zu sein.
In Fällen größerer Abweichungen ist es immer der Leser, der sich geirrt hat.

Rette einen Baum!
Diesen Beitrag nur ausdrucken, wenn unbedingt nötig!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  LV allgemein: Labels der VIs im block diagram immer anzeigen laumann 10 8.740 05.02.2016 09:44
Letzter Beitrag: Freddy
  Systeminformationen Allgemein ermitteln dbuckl 14 8.239 24.03.2015 10:20
Letzter Beitrag: GerdW
  [Allgemein] Hilfe bei Euler-Winkeln Yantit 1 3.003 09.03.2011 08:17
Letzter Beitrag: Yantit
  LabVIEW Allgemein kcccp 11 10.450 06.07.2009 15:00
Letzter Beitrag: kcccp
  DataSocket allgemein Snoop2000 3 4.682 16.04.2008 03:58
Letzter Beitrag: thomas.sandrisser
  Reihenfolge von 2 Case-Strukturen bzw. Case-Struktur allgemein Bob 2 5.229 10.08.2007 14:52
Letzter Beitrag: Bob

Gehe zu: