AGB  ·  Datenschutz  ·  Impressum  







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

Genauigkeit von Datentypen

Ein Thema von PaddyVII · begonnen am 25. Feb 2015 · letzter Beitrag vom 26. Feb 2015
Antwort Antwort
Seite 2 von 3     12 3      
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#11

AW: !!Riesenprobelm mit Datentypen!!

  Alt 25. Feb 2015, 15:32
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
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#12

AW: Genauigkeit von Datentypen

  Alt 25. Feb 2015, 15:58
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
  Mit Zitat antworten Zitat
UliBru

Registriert seit: 10. Mai 2010
155 Beiträge
 
Delphi 11 Alexandria
 
#13

AW: Genauigkeit von Datentypen

  Alt 25. Feb 2015, 16:56
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.
Er wollte so richtig in Delphi einsteigen. Nun steckt er ganz tief drin ...
  Mit Zitat antworten Zitat
Benutzerbild von PaddyVII
PaddyVII

Registriert seit: 20. Nov 2014
Ort: Pforzheim
75 Beiträge
 
Delphi XE6 Enterprise
 
#14

AW: !!Riesenprobelm mit Datentypen!!

  Alt 26. Feb 2015, 10:53
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??
"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."
Dan Rather
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#15

AW: Genauigkeit von Datentypen

  Alt 26. Feb 2015, 11:09
Zitat:
if arGeld[i] = 2 then
if SameValue(arGeld[i], 2, 0.005) then oder
if CompareValue(arGeld[i], 2, 0.005) = EqualsValue then
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Genauigkeit von Datentypen

  Alt 26. Feb 2015, 11:13
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 Currency auf Double umstellen? Macht bei Währungsbeträgen doch Null Sinn.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Genauigkeit von Datentypen

  Alt 26. Feb 2015, 11:15
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von PaddyVII
PaddyVII

Registriert seit: 20. Nov 2014
Ort: Pforzheim
75 Beiträge
 
Delphi XE6 Enterprise
 
#18

AW: Genauigkeit von Datentypen

  Alt 26. Feb 2015, 11:40
[DELPHI]
Aber warum willst du das Programm überhaupt von Currency auf 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...
"Irren ist menschlich, aber wenn man richtigen Mist bauen will, braucht man einen Computer."
Dan Rather
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
642 Beiträge
 
Delphi 10.1 Berlin Professional
 
#19

AW: Genauigkeit von Datentypen

  Alt 26. Feb 2015, 12:04
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.

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;
Gruss Otto PS: Sorry wenn ich manchmal banale Fragen stelle. Ich bin Hobby-Programmierer und nicht zu faul die SuFu zu benutzen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Genauigkeit von Datentypen

  Alt 26. Feb 2015, 12:09
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Feb 2015 um 12:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 11:39 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