![]() |
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? |
AW: Genauigkeit von String to Single Konvertierung
Zitat:
![]() |
AW: Genauigkeit von String to Single Konvertierung
Zitat:
|
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. |
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 |
AW: Genauigkeit von String to Single Konvertierung
Zitat:
|
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.
|
AW: Genauigkeit von String to Single Konvertierung
Um solche grundlegenden Effekte einfacher zu sehen, finde ich auch Minifloats nett:
![]() 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. |
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... |
AW: Genauigkeit von String to Single Konvertierung
Es gibt ja auch andere Möglichkeiten:
![]() 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 03:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz