LabVIEWForum.de - gelesene txt in Nachkomma stellen ungenau

LabVIEWForum.de

Normale Version: gelesene txt in Nachkomma stellen ungenau
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo,

ich beschäftige mich erst seit kurzem mit LabVIEW (für meine Diplomarbeit) und habe ein Problem beim Auswerten meiner Messdateien.

Ich will ein txt-file als Array einlesen und dann Mittelwerte berechnen.
Dafür habe ich mir ein einfaches txt erstellt mit einfachen Zahlen (z.B. 2,0 und 4,6) drin.
Dann habe ich die Funktion "Read from Spreadsheet" verwendet um die Datei einzulesen.
Als ich feststellte das die Rechnungen von meinen mit Excel gemachten Rechnungen abweichen, habe ich mir das einglesene Array wieder speichern lassen. (mit %.10f als Genauigkeit) Dort war aus meiner 4,6 eine 4,5999999147 geworden und aus einer 2,5 eine 2,5000000078. Die 2,0 bleibt gleich. Wacko

Woran könnte das liegen?

Danke schon einmal

Lorien
Es legt an der Genauigkeit der Float (Single) bzw. Double- Zahlen.
Wenn du es noch genauer haben willst, kannst du diese als Integers mit einem Skalenfaktor abspeichern oder Extended Precision verwenden.

Gruss, Eugen
Erstmal danke, so was habe ich vermutet.

Wie mache ich das (etwas genauer: welche Funktion kann ich verwenden? Muss ich die Daten erst convertieren?)?

Habe auch mal versucht die Rechnungen gleich (ohne speichern und wieder einlesen) zu berechnen, war das gleiche Problem. Scheinen also wirklich auch Rundungen beim Rechnen zu sein? Vielleicht Wurzel ziehen?

Lorien
Hab es mit Single Precision probiert und dein Problem gesehen (mit Double Precision aber nicht).
Mein Vorschlag: verwende überall in deinem VI nur Double-Zahlen

Ansonsten Quellcode her.

Gruss
Habe gestern schon mal probiert nen anderes Zahlenformat einzubauen, weiss aber nicht wo genau und wie.

Darum hier der Quellcode und die Test-txts mit den Ergebnissen des Programms.

[attachment=28351:attachment]
[attachment=28352:attachment]
[attachment=28353:attachment]
Also ich habe folgendes gemacht (siehe Bild) und keinen Unterschied zwischen der eingelesenen und abgespeicherter Datei festgestellt.

Gruss, Eugen
<div align="left">Hallo,

ich habe mir jetzt zwar nicht dein VI angeschaut, aber mal eine prinzipielle Bemerkung:

Bis auf wenige mathematische Sonderprogramme (mir fällt da gerade MATHEMATICA ein) kommt es bei allen Programmiersprachen bei der Darstellung von Fließkommazahlen im Computer zu "Ungenauigkeiten", je nachdem auf wie viele Stellen man schaut. Das hängt mit der Art der Darstellung von Fließkommazahlen im Dezimalformat im Binärformat des Computers dar.

Es ist also nicht sonderlich erstaunlich, wenn vor allem bei "Single float" (4 bytes) aus einer 4,6 eine 4,5999999147 wird. Siehe hierzu z.B. auch diese Seite von NI oder auch diese Seite.

Eugen hat prinzipiell recht, "Double float" (8 bytes) Variablen haben eine wesentlich höhere Genauigkeit, wenn man das Ganze aber mit meinetwegen 25 oder sogar mehr Nachkommastellen macht, sieht man wieder minimale Abweichungen.

Also, mit diesen "Ungenauigkeiten" muss man leben.

MfG
Jens</div>
Das mit den Funktionen LabVIEW Measurement File scheint zu klappen.

Habe noch mal ne .vi in der nur Read from Spreadsheet File und gleich danach wieder gespeichert wird (Write spreadsheet file) und auch hier schreibt er in die Nachkommastellen andere Werte. Muss wohl an den LabVIEW Funktionen selber liegen.Wacko

[attachment=2442]

Ungenauigkeiten sind natürlich nicht zu vermeiden, aber bei der 10. Stelle würde ich lieber keine haben.
Kann ich die read und write spreadsheet mit "double float" verwenden? Einfach in den Formatstring mit rein schreiben?


Lorien
<div align="left">Hallo, Lorien,

kann mir dein VI leider nicht anschauen, habe hier am Rechner kein LabVIEW.

Prinzipiell sollten bei Verwendung von mindestens "double" 10 Nachkommastellen korrekt dargestellt werden.

Problen sind dann wohl die Fuktionen "Read form Spreadsheet File" und "Write to Spreadsheet File". Diese benutzen (laut Online-Doku von NI) "single" float Zahlen. Genauigkeit dieser ca. 6-7 Nachkommastellen, also viel zu wenig für 10 Nachkommastellen (s. diese Link)

Da habe ich folgende Empfehlung: Schau dir doch mal den Code dieser VI's an, speichere sie unter einem neuen Namen und ändere die Stellen, wo "single" Variablen stehen auf "double".

LabVIEW kann natürlich beim Einlesen von Daten auch gleich Zahlen mit "double"-Genauigkeit einlesen (ist ja in der Regel erst mal ASCII-Text, der dann entsprechend gewandelt wird). Und wenn LabVIEW in einem der "höheren" VI's die entsprechenden Möglichkeiten nicht bietet, dann muß man es halt selber von Hand machen.

MfG
Jens</div>
Ok, ich probier mal die vi's zu ändern.

Hoffentlich klappts.

Thx schon mal.
Seiten: 1 2
Referenz-URLs