AGB  ·  Datenschutz  ·  Impressum  







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

Single -> Extended

Ein Thema von Gruber_Hans_12345 · begonnen am 8. Sep 2022 · letzter Beitrag vom 12. Sep 2022
Antwort Antwort
Seite 1 von 2  1 2      
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.426 Beiträge
 
Delphi 2007 Professional
 
#1

Single -> Extended

  Alt 8. Sep 2022, 11:14
Delphi-Version: 2010
Blöde frage wie weise ich eine Float Zahl am einfachsten in eine Extended zu, aber ich möchte gerne die zusätzliche Genauigkeit die ich dadurch erhalte mit 0 er füllen.

Delphi-Quellcode:
procedure test;

    function ShowExtended(value : extended) : string;
    begin
        Result := FloatToStrF(value, ffGeneral, 18, 0);
    end;

var
    myFloat : Single;
    myExtended : Extended;
begin
    myFloat := 12.4;
    myExtended := myFloat;

    showmessage(FloatToStr(myFloat)+' ... '+ShowExtended(myExtended));

    myExtended := 12.4;
    showmessage(FloatToStr(myFloat)+' ... '+ShowExtended(myExtended));
end;
Ausgabe1:
Zitat:
12,3999996185303 ... 12,3999996185302734
Ausgabe2:
Zitat:
12,3999996185303 ... 12,4
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.346 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Single -> Extended

  Alt 8. Sep 2022, 11:30
Das Problem ist, dass Zahlen intern nicht im Dezimalsystem gespeichert werden. Deshalb funktioniert dein Gedankengang leider nicht, denn im Binärsystem sind die Nachkomma-Nullen eben keine Nullen, sondern die Zahl wird im Binärsystem so weit angenähert dargestellt wie eben möglich. Vielleicht wäre eine direkte Konversion der Zahl als Dezimalstring in Extended noch ein wenig näher dran, aber trotzdem gibt es weiter hinten bei den meisten Dezimalzahlen immer noch Abweichungen.

Sinnvoller wäre übrigens Double statt Extended, denn Extended gibt es z.B. im 64-Bit Kompiler nicht mehr in der Form, so dass man besser gleich bei Double bleibt oder bei echtem Bedarf spezielle Bibliotheken mit höherer Genauigkeit verwendet.

Die interne binäre Darstellung und die daraus resultierende Ungenauigkeit muss man beim Handling natürlich beachten, aber dann gibt es normalerweise auch keine Probleme damit. Für höhere Genauigkeit gibt es wie eben geschrieben spezielle Bibliotheken.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#3

AW: Single -> Extended

  Alt 8. Sep 2022, 16:10
Hallo Hans,
wie Sebastian bereits geschrieben hat, gibt es wegen der binären Kodierung bei allen RealTypen unvermeidbare Rundungsfehler. Das liegt in der Natur der Sache, denn es gibt unendlich viele Reelle Zahlen, die wir mittels Single, Real48, Double oder Extended auf eine endliche Menge binärer Darstellungen mit endlichen Ziffern abbilden.
Selbst die Dezimalzahl 0,1 läßt sich binär nicht exakt darstellen, wodurch bereits bei der Eingabe ein Rundungsfehler entsteht.

Dein Vorhaben läßt sich daher leider nicht realisieren. Wenn es Dir lediglich um die Anzeige der Ergebnisse mittels ShowMessage(..) geht, dann hilft nur das "Verstecken" der falschen Ziffern durch Runden der Zahlen bzw. der Anzeige...

Wenn Du ausschließlich für Windows programmierst und ein 32-Bit-Kompilat verwenden wills, würde ich Dir allerdings Extended empfehlen, nicht Double: Damit hast Du einen wesentlich größeren Zahlenbereich, 3..4 Stellen mehr und damit weniger Rundungsfehler als bei Double.

Grüße, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Single -> Extended

  Alt 8. Sep 2022, 16:18
Wenn es ganz genau sein soll, dann Currency oder BCD.

Oder eben bei/nach dem Convertieren und sowieso beim Verwenden entsprechend der maximal nötigen Nachkommastellen runden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Single -> Extended

  Alt 8. Sep 2022, 16:23
Wenn es ganz genau sein soll, dann Currency oder BCD ...
Sorry, aber das ist nur bei Addition und / oder Subtraktion exakt. Nicht bei Multiplikation, schon gar nicht beim Dividieren und überhaupt nicht bei transzendenten Funktionen wie exp(x), Ln(x), sin(x) etc.
Grüße, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#6

AW: Single -> Extended

  Alt 8. Sep 2022, 16:53
Dieser Artikel könnte dem einen oder anderen evtl. beim Verständnis von Fließkommazahlen helfen:
http://rvelthuis.de/articles/articles-floats.html
  Mit Zitat antworten Zitat
Redeemer

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

AW: Single -> Extended

  Alt 8. Sep 2022, 17:10
Das ist jetzt so 'ne Frage wie: „Ich habe meine JPEGs letztens mit 0% Qualität gespeichert. Jetzt hab ich die dabei erstellten Dateien mit 100% Qualität erneut gespeichert und sie sehen trotzdem noch scheiße aus.“

Informationen, die einmal verloren gegangen sind, können nicht wiederhergestellt werden, selbst wenn genug Platz dafür wäre.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
482 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Single -> Extended

  Alt 12. Sep 2022, 10:55
Im Grunde kannst du das schon machen (mithilfe eines Rundungskoeffizienten, auch "Epsilon" genannt).
Das führt allerdings dazu, dass dein Extended intern weiterhin als Single gerundet wird, was sicher auch nicht das ist, was du willst.
Es gibt nur einen Weg, keine Rundungsfehler bei Gleitkomma zu haben. Und das ist, einfach kein Gleitkomma zu benutzen. Ggf reicht ja ein Currency-Wert aus?
Dennis
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
563 Beiträge
 
Delphi XE6 Enterprise
 
#9

AW: Single -> Extended

  Alt 12. Sep 2022, 11:43
Wenn es ganz genau sein soll, dann Currency oder BCD ...
Sorry, aber das ist nur bei Addition und / oder Subtraktion exakt. Nicht bei Multiplikation, schon gar nicht beim Dividieren und überhaupt nicht bei transzendenten Funktionen wie exp(x), Ln(x), sin(x) etc.
Grüße, Andreas
Kommt auf die Operanden an: 1/4 ist bei BCD genau 0,25. Currency hat nur 4 Nachkommastellen, da kann es schon eng werden, aber BCD hat prinzipiell keine Längenbeschränkung.
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
482 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Single -> Extended

  Alt 12. Sep 2022, 12:23
Kommt auf die Operanden an: 1/4 ist bei BCD genau 0,25. Currency hat nur 4 Nachkommastellen, da kann es schon eng werden, aber BCD hat prinzipiell keine Längenbeschränkung.
Jo, ist halt nur (um ein vielfaches) langsamer. Ansonsten kann man das schon mal benutzen. Wenn du aber ausgehend einen Float/Extended-Wert hast, dann bringt dir das natürlich auch nicht viel; runden musst du dann trotzdem.
Dennis
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 03:23 Uhr.
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