Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Genauigkeit von Datentypen (https://www.delphipraxis.net/184097-genauigkeit-von-datentypen.html)

mjustin 25. Feb 2015 14:32

AW: !!Riesenprobelm mit Datentypen!!
 
Zitat:

Zitat von Mikkey (Beitrag 1291484)
Da üblicherweise die Mantisse binär dargestellt wird, kann man sich noch nicht einmal darauf verlassen, dass kleine ganze Zahlen oder Brüche aus kleinen ganzen Zahlen exakt wiedergegeben werden.

42 geteilt durch 7 ergibt eine Zahl die kleiner als 10 ist :)

BUG 25. Feb 2015 14:58

AW: Genauigkeit von Datentypen
 
Geld ist ja ein bisschen ein Spezialfall, da es scheinbar gebrochene Werte sind, aber eigentlich gibt es eine diskrete Einheit z.B. 1 Cent.

Bei den meisten physikalischen Größen wie Geschwindigkeit, Masse, usw. hat man oft denn Fall, dass die Eingabewerte eine viel geringere Messgenauigkeit haben als die Ungenauigkeit der Gleitkommazahlen. Ansonsten ist das korrekte Umgehen mit numerische Ungenauigkeiten eine nicht triviale Aufgabe und wird häufig einfach ignoriert :mrgreen:

UliBru 25. Feb 2015 15:56

AW: Genauigkeit von Datentypen
 
Einen netten Überblick zum Thema Genauigkeit von Gleitkommazahlen gibt
https://software.intel.com/sites/def...ol-2012-08.pdf

Das Rechnen mit Geld hat auch Tücken trotz fester kleiner Einheiten, also z.B. 1 Cent. Nämlich dann wenn z.B. Mehrwertsteuer ins Spiel kommt. Wo dann eben wiederum kleinere Werte als die genannten Einheiten auftreten.

PaddyVII 26. Feb 2015 09:53

AW: !!Riesenprobelm mit Datentypen!!
 
Zitat:

Zitat von Union (Beitrag 1291467)
Das liegt an der internen Darstellung. Ein Wert 0.5 wird als Double evtl. als 0.5000000128973 gespeichert. Für diese Fälle arbeite mit CompareValue mit einem entsprechenden Delta.

Wie würde denn das programm mit compareValue aussehen??

DeddyH 26. Feb 2015 10:09

AW: Genauigkeit von Datentypen
 
Zitat:

Delphi-Quellcode:
if arGeld[i] = 2 then

Delphi-Quellcode:
if SameValue(arGeld[i], 2, 0.005) then
oder
Delphi-Quellcode:
if CompareValue(arGeld[i], 2, 0.005) = EqualsValue then

Sir Rufo 26. Feb 2015 10:13

AW: Genauigkeit von Datentypen
 
Delphi-Quellcode:
var
  Val1, Val2 : Double;

if CompareValue( Val1, Val2 {, Epsilon} ) then
  ShowMessage( 'Sind Gleich' );
Das Epsilon kann ein beliebiger Wert sein, der den maximalen Unterschied angibt, bei dem die Wert noch gleich sind.

Aber warum willst du das Programm überhaupt von
Delphi-Quellcode:
Currency
auf
Delphi-Quellcode:
Double
umstellen? Macht bei Währungsbeträgen doch Null Sinn.

himitsu 26. Feb 2015 10:15

AW: Genauigkeit von Datentypen
 
Und wenn man die 0.005 weg lässt, dann wird automatisch ein typspezifischer Wert genommen.

Delphi-Quellcode:
const
  FuzzFactor = 1000;
  ExtendedResolution = 1E-19 * FuzzFactor;
  DoubleResolution  = 1E-15 * FuzzFactor;
  SingleResolution  = 1E-7 * FuzzFactor;

function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
  if Epsilon = 0 then
    Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
  ...
end;

function IsZero(const A: Extended; Epsilon: Extended): Boolean;
begin
  if Epsilon = 0 then
    Epsilon := ExtendedResolution;
  ...
end;

PaddyVII 26. Feb 2015 10:40

AW: Genauigkeit von Datentypen
 
Zitat:

Zitat von Sir Rufo (Beitrag 1291590)
[DELPHI]
Aber warum willst du das Programm überhaupt von
Delphi-Quellcode:
Currency
auf
Delphi-Quellcode:
Double
umstellen? Macht bei Währungsbeträgen doch Null Sinn.

ich hatte nie vor es umzustellen, ich hatte nur als erstes double drinstehn, als es nicht funktioniert hat dann single und später erst currency...

mm1256 26. Feb 2015 11:04

AW: Genauigkeit von Datentypen
 
Ob es Sinn macht, statt Double Currency zu verwenden muss wohl jeder für sich selber entscheiden. Es kommt auf den Einzelfall an. Wenn z.B. ein Preis aus Menge mit bis zu 3 Nachkommastellen, Rabatt mit zwei Nachkommastellen, oder sogenannten Multi's wie sie bei Datanorm verwendet werden mit 3 Nachkommastellen....usw. berechnet werden muss, dann muss man Double und Currency mischen. Das ist auch nicht der Hit und darum kann es eleganter sein, die Doubles entsprechend zu behandeln.

Zitat:

Zitat von DeddyH (Beitrag 1291589)
Delphi-Quellcode:
if SameValue(arGeld[i], 2, 0.005) then

... in eine kleine Funktion packen, wenn man Double's für Beträge verwenden möchte

Delphi-Quellcode:
function GleicherBetrag(D1, D2: double): boolean;
begin
  Result := SameValue(D1, D2, 0.011);
end;

himitsu 26. Feb 2015 11:09

AW: Genauigkeit von Datentypen
 
Muss?
Currency = 4 Nachkommastellen

Bei Epsilon=0.011 ist 0.01 = 0.02 .
Epsilon muß kleiner als die Hälfte der kleinsten erlaubten Differenz sein, um "sicher" vergleichen zu können.
Wenn A=3, B=4 und Epsilon=>0.5, dann würde 3.5 verglichen mit A und B jeweils "gleich" sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:00 Uhr.
Seite 2 von 3     12 3      

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