Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Genauigkeit von String to Single Konvertierung (https://www.delphipraxis.net/203853-genauigkeit-von-string-single-konvertierung.html)

Harry Stahl 31. Mär 2020 23:21

Delphi-Version: 10.3 Rio

Genauigkeit von String to Single Konvertierung
 
Wenn ich einen String mit dem Inhalt "29,7" zu einem Variablen Wert des Typs "Single" per StrToFloat (oder String.tosingle) konvertiere, erhalte ich als Ergebnis "29,7000007629395".

Erst ab Variablen Typ "Double" aufwärts erhalte ich 29.7 als Wert.

Mir ist zwar bekannt, dass Single nur 4 Byte hat und man daher von einer "geringen Rechengenauigkeit" spricht (double hat 8 Byte), aber ich habe das immer auf Berechnungsergebnisse bezogen (also multiplizieren, dividieren, etc.), wieso gibt es hier bei so einer einfachen Konvertierung eine Ungenauigkeit?

jaenicke 1. Apr 2020 06:00

AW: Genauigkeit von String to Single Konvertierung
 
Zitat:

Zitat von Harry Stahl (Beitrag 1460957)
wieso gibt es hier bei so einer einfachen Konvertierung eine Ungenauigkeit?

Weil die Zahlen im PC im Binärsystem dargestellt werden, Stichwort Zweierkomplement (übrigens im Studium ein Lieblingsthema bei einigen :lol:). Hier im Video ist das auf den ersten Blick gut zu sehen (hab nur kurz auf die Tafel geschaut, nicht zugehört):
https://www.youtube.com/watch?v=hHpSwBf0DCA

dummzeuch 1. Apr 2020 08:19

AW: Genauigkeit von String to Single Konvertierung
 
Zitat:

Zitat von Harry Stahl (Beitrag 1460957)
Mir ist zwar bekannt, dass Single nur 4 Byte hat und man daher von einer "geringen Rechengenauigkeit" spricht (double hat 8 Byte), aber ich habe das immer auf Berechnungsergebnisse bezogen (also multiplizieren, dividieren, etc.), wieso gibt es hier bei so einer einfachen Konvertierung eine Ungenauigkeit?

Auch diese "einfachen Konvertierungen" sind Berechnungen. Und so simpel sind die nun mal nicht, da von der Dezimal- in die Binärdarstellung und zurück konvertiert werden muss (du hast also in Deinem Beispiel schon zwei Konvertierungen). Das geht für manche Zahlen einfach und ohne Rundungs-Fehler, für andere sind die Fehler relativ groß.

Uwe Raabe 1. Apr 2020 08:29

AW: Genauigkeit von String to Single Konvertierung
 
Das eigentlich Problem ist, daß sich der Wert 29,7 weder als Single noch als Double exakt darstellen lässt. Der Compiler erzeugt daher eine die dem Wert nächste Binärdarstellung:

Double: 11101.10110011001100110011001100110011001100110011 0011 = 29.69999999999999928945726423989981412887573242187 5
Single: 11101.101100110011001101 = 29.700000762939453125

Durch die begrenzte Anzahl der Ziffern bei der Darstellung erscheint der Double-Wert exakt, obwohl er es auch nicht ist.

Andreas13 1. Apr 2020 09:11

AW: Genauigkeit von String to Single Konvertierung
 
Ganz allgemein: Mit einer endlichen Anzahl von Bits (4, 8,10) lassen sich nicht unendlich viele reelle Zahlen exakt darstellen.
Gruß, Andreas

Redeemer 1. Apr 2020 18:19

AW: Genauigkeit von String to Single Konvertierung
 
Zitat:

Zitat von Harry Stahl (Beitrag 1460957)
Wenn ich einen String mit dem Inhalt "29,7" zu einem Variablen Wert des Typs "Single" per StrToFloat (oder String.tosingle) konvertiere, erhalte ich als Ergebnis "29,7000007629395".

Erst ab Variablen Typ "Double" aufwärts erhalte ich 29.7 als Wert.

Mir ist zwar bekannt, dass Single nur 4 Byte hat und man daher von einer "geringen Rechengenauigkeit" spricht (double hat 8 Byte), aber ich habe das immer auf Berechnungsergebnisse bezogen (also multiplizieren, dividieren, etc.), wieso gibt es hier bei so einer einfachen Konvertierung eine Ungenauigkeit?

Ein Computer kann grundsätzlich keine Gleitkommazahlen speichern, deren letzte Nachkommastelle nicht 5 ist. Zahlen, deren letzte Nachkommastelle 5 ist, zwar in den allermeisten Fällen auch nicht, aber wenn du eine Zahl siehst, die nicht auf 5 endet, kann sie ein Computer niemals als Gleitkommazahl speichern. 29,7 endet nicht auf 5, kann also nicht gespeichert werden. Exakte Kommazahlen mit 4 Nachkommastellen können als Currency (=Int64, das als Zehntausendstel behandelt wird) abgelegt werden. Für alle anderen Fälle musst du dir selbst was schreiben.

Luckie 1. Apr 2020 19:31

AW: Genauigkeit von String to Single Konvertierung
 
Gleitkommazahlen können nicht exakt binär dargestellt werden. Das ist alles. Wandele 29,7 einfach mal per Hand schriftlich in eine binäre Zahl um, dann siehst du es.

jfheins 1. Apr 2020 19:37

AW: Genauigkeit von String to Single Konvertierung
 
Um solche grundlegenden Effekte einfacher zu sehen, finde ich auch Minifloats nett: https://de.wikipedia.org/wiki/Minifloat

Da wird ein einzelnes Byte als Gleitkommazahl genutzt. Die kleinste positive Zahl > 0 ist dann 0.125 und es geht bis zu 122880 - mit entsprechenden lücken.
Deine 29.7 wären da zwischen den beiden möglichen Werten 28 und 32 und würden im besten Fall auf 28 gerundet. Solche Rundungen sind prinzipiell (wie schon weiter oben beschrieben) unvermeidlich, nur in der Magnitude beeinflussbar durch die Menge an Bits.

Harry Stahl 1. Apr 2020 22:05

AW: Genauigkeit von String to Single Konvertierung
 
Tja, man lernt nie aus...

Danke für die Erläuterungen. Ist gut zu wissen, wenn man irgendwelche Eingaben aus Edit-feldern übernimmt bzw. Positionsangaben für Objekte (unter FMX sind die Positionsangaben für Controls ja auch Single-Werte und nicht Integer, immerhin), vor allen Dingen, wenn man etwas berechnen will, das "relativ" genau sein sollte...

p80286 1. Apr 2020 22:27

AW: Genauigkeit von String to Single Konvertierung
 
Es gibt ja auch andere Möglichkeiten:https://de.wikipedia.org/wiki/BCD-Code
Lesen und sich eine eigene Meinung bilden.

Gruß
K-H

P.S.
Meine Ausbilderin (ende der 70er) sagte immer Rechner sind schnell oder genau. Beides auf einmal geht nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz