AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Passenden Datentypen gesucht

Ein Thema von NoNoPe · begonnen am 24. Apr 2013 · letzter Beitrag vom 25. Apr 2013
Antwort Antwort
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#1

AW: Passenden Datentypen gesucht

  Alt 24. Apr 2013, 18:02
Currency ist naheliegend, hat aber teilweise Schwächen, bedingt durch Bugs im Compiler. Mit manchen Delphi Versionen liefert dieses Programm die Ausgabe "strange":

Delphi-Quellcode:
program Project14358407;

{$APPTYPE CONSOLE}

var
  C: Currency;
begin
  C := 1.32;

  if C <> 1.32 then
  begin
    WriteLn('strange');
  end;

  ReadLn;
end.
Michael Justin

Geändert von mjustin (24. Apr 2013 um 18:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Passenden Datentypen gesucht

  Alt 24. Apr 2013, 18:34
Das ist aber keine Spezialität von Currency.
Ein Vergleich von
   if C <> 1.32 then wird außer bei Extended und Variant immer anschlagen single,real,double ....
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.010 Beiträge
 
Delphi 2009 Professional
 
#3

AW: Passenden Datentypen gesucht

  Alt 24. Apr 2013, 18:38
Das ist aber keine Spezialität von Currency.
Laut Barry Kelly ist Currency "not susceptible to precision issues in the same way that floating point code is." (link), insofern ist Currency schon etwas Besonderes. In den meisten Delphi Version liefert der Vergleich auch wie erwartet False.
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Passenden Datentypen gesucht

  Alt 25. Apr 2013, 00:34
Deshalb gibt es ja die Funktion Delphi-Referenz durchsuchenCompareValue:
Delphi-Quellcode:
if CompareValue(1.32, C, 0.005) <> EqualsValue then
   Writeln('Arrrr');
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#5

AW: Passenden Datentypen gesucht

  Alt 25. Apr 2013, 06:58
Alles Falsch.

Currency heißt nicht umsonst Currency. Das soll *genau* rechnen können. Ich kauf mir doch keinen Ferarri, den ich dann vom Pferd ziehen lasse..

Eigentlich ist Currency ein Int64, allerdings um 4 Dezimalstellen nach links geschoben. Und da die Umsetzung von Int64 im Compiler meines Wissens nach nicht 100% korrekt ist, kann es zu Problemen führen (zumindest früher)

Beweis:
Delphi-Quellcode:
Program CurrencyIsInt64;
Var
  c : Currency;
  i : Int64 absolute c;

begin
  writeln(c);
  writeln(i);
end.
Mit Currency sind also 14 Stellen vor dem Komma (und 4 danach) darstellbar.

Alternativen wären Klassen, wie TBigNum oder BigInt. Beides zu ergoogeln oder zu erdepelen ("in der DP suchen")
TBCD geht auch, ist aber im Wertebereich beschränkt und erst in "neueren" Versionen vorhanden(?)

Nebenbei:
Ein Vergleich von...wird außer bei Extended und Variant immer anschlagen single,real,double ....
Auch falsch. Alles was floating point ist, und dazu gehört auch extended und variant (wenn der einen FP kapselt) sollte *NIE* auf Gleichheit geprüft werden. Es kann funktionieren (und bei Extended ist die Wahrscheinlichkeit größer, das es funktioniert), aber es muss nicht.

Beweis:
Delphi-Quellcode:
Var
  e,e1 : Extended;

begin
  e := 0;
  repeat
    e1 := e;
    e := e+0.1;
  until e-e1<>0.1;
  writeln(FloatToStr(r));
end.
Merke: Floating Point ist schnell, aber nicht genau.

Geändert von Furtbichler (25. Apr 2013 um 07:06 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#6

AW: Passenden Datentypen gesucht

  Alt 25. Apr 2013, 07:37
Ich vergleiche immer ganz gerne mit einer eigenen Funktion, der ich noch einen Tolleranz-Wert mit übergebe . Grüße
function IsAboutEqual(Zahl1, Zahl2 : Double; Tolleranz : Integer) : Boolean;
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: Passenden Datentypen gesucht

  Alt 25. Apr 2013, 07:42
Mein Fokus lag nicht auf einem Vergleich von Fließkommazahlen, sondern auf der Zuweisung von Konstanten und dem Vergleich mit ihnen, da hier der Wert eines Typs Extended mit was auch immer verglichen wird.
CompareValue, SameValue etc. sind mir durchaus geläufig.

@mjustin danke, ich kannte den Beitrag auf Stackoverflow, hatte dieses Verhalten allerdings aufgrund der Verarbeitung mit Fließkommazahlen als selbstverständlich angesehen.
Wirklich unschön finde ich dass sich das Verhalten bei den verschiedene Delphiversionen unterscheidet.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:21 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