Float Wert

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Float Wert

Beitrag von Johannes »

Hallo Forum,

in meinem kleinen Projekt nutze ich mehrere Tedit um Längenangaben zu machen. Diese werden im Format "double" hinterlegt, in Array`s abgelegt und via Records gespeichert und, bei Bedarf, wieder ins Projekt geladen. Das hat alles schon einige Zeit gut funktioniert. Mein Programmchen hatte ich mit LAZ 64 erstellt. Aus verschiedenen Gründen habe ich nun die 32 Bit Version Lazarus installiert und es zeigt sich folgendes Verhalten:
Wenn ich einen Wert mit einem Komma eingebe (z.B. 124,65) dann erhalte ich beim Auslesen 124,6500015 .
Um Codefehler auszuschließen habe ich, zum Testen, das gebastelt:

Code: Alles auswählen

procedure TSteuerung_A.Edit1EditingDone(Sender: TObject);
begin
  Test:= StrToFloat(Edit1.Text);
end;
 procedure TSteuerung_A.Button1Click(Sender: TObject);
begin
   Edit2.Text:= FloatToStr(Test);
end;                                                       
Woher kommt das Verhalten?

Gruß

Hannes
(Lazarus IDE v 1.4.4)

P.S. Weil mir das jetzt keine Ruhe gelassen hat habe ich ein neues Projekt erstellt. Darin läuft es so wie es soll!
Nicht erwähnt hatte ich, dass ich mich mit "Andorra" beschäftige. Daher auch der Wechsel zur 32 Bit Version von Lazarus.
Nach dem Auskommentieren der Andorra-Routinen klappt es auch wieder mit korrekten Float-Werten!
Wer kommt denn auf so Etwas?
Zuletzt geändert von Johannes am Di 2. Feb 2016, 23:40, insgesamt 1-mal geändert.

Warf
Beiträge: 2121
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Float Wert

Beitrag von Warf »

Floats werden von dem PC in dem so genannte IEEE 754 Standard gespeichert, und dieser ist ungenau, und kann nicht alle werte halten, z.B. kann IEEE 754 kein 124,65 darstellen, daher wird die nächst mögliche Zahl verwendet, 124,6500015

Einfach eine Teschniche Limitierung.

Etwas besser wird es mit größeren Datentypen, so hat Single nur 32 bit und ist damit ungenauer als double mit 64 bit, und der genauste Float typ in Pascal ist Extended mit 80 Bit

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Float Wert

Beitrag von Johannes »

Ich danke Dir aber wie ist es zu erklären was ich gerade noch herausgefunden habe? (siehe mein P.S. oben)
Warum klappt das dann in einem anderen Projekt? Und warum wenn ich einige Zeilen Code, in meinem Projekt, darüber auskommentiere?
Zuletzt geändert von Johannes am Di 2. Feb 2016, 23:54, insgesamt 1-mal geändert.

Warf
Beiträge: 2121
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Float Wert

Beitrag von Warf »

Dich gehe mal davon aus das Andorra den Bezeichner des datentypen mit einem anderen bezeichner überschreibt (also z.b. anstatt double wird single verwendet)

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Float Wert

Beitrag von BeniBela »

In der math unit gibt SetRoundMode und SetPrecisionMode, das kann einiges durcheinander bringen

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Float Wert

Beitrag von Johannes »

Ich habe es mit beiden Typen (float u. single) probiert. Das Ergebnis war gleich sobald ich das Trennzeichen benutzte.

Die Unit math wird in diesem Form nicht benutzt.

Warf
Beiträge: 2121
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Float Wert

Beitrag von Warf »

Johannes hat geschrieben:Ich habe es mit beiden Typen (float u. single) probiert. Das Ergebnis war gleich sobald ich das Trennzeichen benutzte.

Die Unit math wird in diesem Form nicht benutzt.
Single ist immer Single Precision als 32 Bit, float ist ein Bezeichner welcher irgendwo als entweder double, single oder extended gesetzt wird. Verwende einfach double oder extended wenn du eine höhere Genauigkeit haben möchtest, oder, wenn dich einfach nur die Textausgabe stört verwende zum Konvertieren in Text einfach FloatToStrF, da kannst du die Präzision angeben

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Float Wert

Beitrag von Johannes »

Das Dumme ist nur, dass diese "krummen" Werte natürlich auch in meinen abgespeicherten Records liegen. FloatToStrF kann man ja nicht bei der Eingabe anwenden.
Zudem wird mit den Werten auch noch fleissig gerechnet. Es sind ja keine nennenswerten Abweichungen aber ärgerlich ist das Ganze trotzdem.
Außerdem muss ich mit dem Eingabeformat flexibel bleiben denn es sollen auch Daten in Inch (mindestens 3 Zeichen hinterm Komma) möglich sein.

Wenn ich die Initialisierung von "Andorra" unterdrücke ist ja auch alles in Ordnung. Sobald "AdDraw := TAdDraw.Create(self);" im OnCreate abgelaufen ist kommt es zu dem Verhalten.

BeniBela
Beiträge: 320
Registriert: Sa 21. Mär 2009, 17:31
OS, Lazarus, FPC: Linux (Lazarus SVN, FPC 2.4)
CPU-Target: 64 Bit

Re: Float Wert

Beitrag von BeniBela »

Andorra könnte die Präzision genauso ändern, wie die Funktionen aus math...


Ein bisschen ist es bei float halt imimer so. Du könntest stattdessen meinen bigdecimal nehmen, der rundet nicht

Johannes
Beiträge: 174
Registriert: Sa 9. Jan 2016, 09:30

Re: Float Wert

Beitrag von Johannes »

Ich danke Dir.
Nach langem Suchen habe ich dazu Einiges gefunden: http://chrisvall.com/coding/directx-tro ... ing-direct

Gruß
Hannes

Antworten