AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Genauigkeit von String to Single Konvertierung

Ein Thema von Harry Stahl · begonnen am 31. Mär 2020 · letzter Beitrag vom 19. Apr 2020
Antwort Antwort
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.129 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Genauigkeit von String to Single Konvertierung

  Alt 1. Apr 2020, 18:19
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.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Genauigkeit von String to Single Konvertierung

  Alt 1. Apr 2020, 19:31
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

AW: Genauigkeit von String to Single Konvertierung

  Alt 1. Apr 2020, 19:37
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.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.561 Beiträge
 
Delphi 12 Athens
 
#4

AW: Genauigkeit von String to Single Konvertierung

  Alt 1. Apr 2020, 22:05
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...
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Genauigkeit von String to Single Konvertierung

  Alt 1. Apr 2020, 22:27
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.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 1. Apr 2020 um 22:30 Uhr)
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.513 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Genauigkeit von String to Single Konvertierung

  Alt 2. Apr 2020, 17:27
Da hat sie sicher recht. Allerdings ungenau UND langsam geht auch recht einfach.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.239 Beiträge
 
Delphi 12 Athens
 
#7

AW: Genauigkeit von String to Single Konvertierung

  Alt 3. Apr 2020, 06:42
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.
Wenn man den Wertebereich genau kennt, und auch die gewünschte Auflösung fix ist kann man ja auch mit integer arbeiten.
Z.B. Bereich ist innerhalt +/-100000 mit einer Auflösung von 0.001, dann kann man einfach intern mit IntVariable * 1000 rechnen, und nur bei Anzeigen wieder um 1000 korrigieren.
Die internen Berechnungen sind dann sehr schnell, mit Integer, nur bei den Ein- Ausgaben muss man konvertieren.
Das ist dann sehr exakt, nur bei Berecnungen muss man aufpassen das man nicht das Integer-Limit überschreitet.
Man könnte sich einen eigenen Typ dafür bauen und/oder mit record helpern eine Überlaufprüfung o.ä. einbauen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.538 Beiträge
 
Delphi 12 Athens
 
#8

AW: Genauigkeit von String to Single Konvertierung

  Alt 3. Apr 2020, 08:28
mit einer Auflösung von 0.001, dann kann man einfach intern mit IntVariable * 1000 rechnen, und nur bei Anzeigen wieder um 1000 korrigieren.
Die internen Berechnungen sind dann sehr schnell, mit Integer, nur bei den Ein- Ausgaben muss man konvertieren.
Das ist dann sehr exakt, nur bei Berecnungen muss man aufpassen das man nicht das Integer-Limit überschreitet.
Man könnte sich einen eigenen Typ dafür bauen und/oder mit record helpern eine Überlaufprüfung o.ä. einbauen.
Delphi-Referenz durchsuchenCurrency
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.239 Beiträge
 
Delphi 12 Athens
 
#9

AW: Genauigkeit von String to Single Konvertierung

  Alt 3. Apr 2020, 10:06
Ja kann man nehmen, aber wenn z.B. Auflösung 0.0000001 gebraucht wird muss man sich was selber basteln, oder nicht ?
Currency wäre natürlich eine gute Basis.

Zitat:
Currency is a fixed-point data type. The maximum error when converting from floating-point to Currency is 0.00005.
Ich meine Curreny nutzt */ 10000 fix, oder kann man das irgendwo einstellen ?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.752 Beiträge
 
Delphi 12 Athens
 
#10

AW: Genauigkeit von String to Single Konvertierung

  Alt 3. Apr 2020, 11:09
Nein, Currency kennt nur 4 Nachkommastellen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 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