Delphi 2005 Arbeiten mit Kommazahlen

Alles zu Zusi-Performance, Frameraten, ruckelnden Bildern, Grafik, Treibern usw.
Antworten
Nachricht
Autor
Reinhard Raschke
Beiträge: 113
Registriert: 25.11.2009 22:28:07
Aktuelle Projekte: Modul Herzebrock
Wohnort: 33442 Herzebrock

Delphi 2005 Arbeiten mit Kommazahlen

#1 Beitrag von Reinhard Raschke »

Hallo Zusianer & Delphianer,

warum liefert Delphi mit nachfolgendem Code als Ergebnis 0.0999999046325684 und nicht 0.1 wie jeder normale 1€-Taschenrechner?
Die Variable c wird später noch für if-Routinen verwendet, da hilft ein Schönformatieren mit FloatToStrF wenig.
Für einen Gedankenschubser wäre ich sehr dankbar!

..

procedure TForm1.Button53Click(Sender: TObject);
var
i: Integer;
Durchgang: Integer;
a: Single;
b: Single;
c: Single;

begin
a := 5.1;
b := 5;
c := a - b;
showmessage(FloatToStr(c));
..
end;

Gruß

Reinhard

Benutzeravatar
Johannes
Beiträge: 3197
Registriert: 14.03.2009 22:36:06
Aktuelle Projekte: Zusitools (http://git.io/zusitools)

Re: Delphi 2005 Arbeiten mit Kommazahlen

#2 Beitrag von Johannes »

https://de.wikipedia.org/wiki/Gleitkomm ... arithmetik" target="_blank

„Gleitkommazahlen warten besonders für den mathematischen Laien mit einigen Überraschungen auf, die auch oft das Ergebnis von Taschenrechner- und Computerrechnungen beeinflussen. Am wichtigsten sind außer Kraft gesetzte geläufige mathematische Rechenregeln. Wer intensiv mit einem Rechenhilfsmittel arbeitet, muss diese Eigenschaften kennen. Sie gehen auf die begrenzte Genauigkeit zurück, mit der Mantisse und Exponent gespeichert werden.“

Double statt Single zu verwenden wäre ein erster Schritt zu mehr Genauigkeit.
Zuletzt geändert von Johannes am 01.11.2020 10:46:38, insgesamt 1-mal geändert.

Benutzeravatar
Jens Haupert
Beiträge: 4911
Registriert: 23.03.2004 14:44:34
Aktuelle Projekte: http://www.zusidisplay.de
Wohnort: Berlin
Kontaktdaten:

Re: Delphi 2005 Arbeiten mit Kommazahlen

#3 Beitrag von Jens Haupert »

Johannes hat geschrieben:Double statt Single zu verwenden wäre ein erster Schritt zu mehr Genauigkeit.
Hallo,

bei dotnet wird dann das Ergebnis zu 0.099999999999999645. Das ist näher dran, hilft einem aber auch nicht weiter. :D

@Reinhard: Wenn man Fließkommazahlen ausgeben oder testen will, sollte man diese immer auf die gewünschte Nachkommastelle runden. Und in deinem Fall würde man noch besser den Abstand prüfen. Also z.B. if (Math.Abs(0.1 - c) < 0.1) oder so.

Grüße
Jens
Zuletzt geändert von Jens Haupert am 01.11.2020 10:56:36, insgesamt 3-mal geändert.

Benutzeravatar
Michael_Poschmann
Beiträge: 19877
Registriert: 05.11.2001 15:11:18
Aktuelle Projekte: Modul Menden (Sauerland)
Wohnort: Str.Km "1,6" der Oberen Ruhrtalbahn (DB-Str. 2550)

Re: Delphi 2005 Arbeiten mit Kommazahlen

#4 Beitrag von Michael_Poschmann »

Jens, alles eine Frage der inschinörmäßigen Abschätzung. Wie war das noch? "Pi ist gleich Drei, für genügend kleine Pi und große Drei."

Grüße aus dem Ungefähren
Michael

Reinhard Raschke
Beiträge: 113
Registriert: 25.11.2009 22:28:07
Aktuelle Projekte: Modul Herzebrock
Wohnort: 33442 Herzebrock

Re: Delphi 2005 Arbeiten mit Kommazahlen

#5 Beitrag von Reinhard Raschke »

@ all : Danke für eure Beiträge

Da es sich später bei den Zahlen um Zusi-Koordinaten handelt, möchte ich vom Runden absehen. Ich will die Daten nicht unnötig verfälschen (Wenn auch nur sehr geringfügig).

Ich werde versuchen das Problem damit zu lösen, die Kommazahl (liegt als String vor) in eine Integer-Form zu zwingen, die ich dann ordentlich bearbeiten kann.

Gruß

Reinhard

Antworten