AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi [DUnit] Test für Double Property schlägt fehl
Thema durchsuchen
Ansicht
Themen-Optionen

[DUnit] Test für Double Property schlägt fehl

Ein Thema von Zwoetzen · begonnen am 26. Mär 2009 · letzter Beitrag vom 26. Mär 2009
Antwort Antwort
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#1

[DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 10:13
Hi DP'ler,

habe mich nun mal mit DUnit vertraut gemacht, und finde das ganze recht hilfreich ^^
Doch ich stehe vor einem Problem, was ich nicht nachvollziehen kann:

Ich habe eine Klasse, die einen Double-Wert als Property hat:
Delphi-Quellcode:
type
  TMyObjet = class(TObject)
  private
    FD: Double;
    procedure SetD(const Value: Double);
  public
    property D: Double read FD write SetD;
  end;

[...]

procedure TMyObjet.SetD(const Value: Double);
begin
  FD := Value;
end;
Der dazugehörige, sehr einfache Test schlägt allerdings schon fehl:
Delphi-Quellcode:
type
  TestMyObject = class(TTestCase)
  strict private
    FMyObject: TMyObject;
  protected
    procedure SetUp; override;
    procedure TearDown; override;
  published
    procedure TestDouble;
  end;

[...]

procedure TestMyObject.TestDouble;
begin
  FMyObject.D := 1.23;
  CheckEquals(1.23, FMyObject.D, 'Wrong Value of D');
end;
Wenn ich den Test nun ausführe, bekomme ich die Meldung:
Code:
TestDouble: ETestFailure
at $004A3FED
Wrong Value of D, expected: <1,23> but was: <1,23>
Kann mir jemand den Fehler sagen? Denn die Zuweisung des Doubles sollte eigentlich korrekt sein (da passiert ja eigentlich nix ^^), nur der Test schlägt eben fehl, was mich verwundert. (Die Meldung selbst sagt ja, dass (korrekterweise) 1.23 vorhanden war, aber wieso gibt es trotzdem ein ETestFailure?)

MfG Zwoetzen
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

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

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 10:33
Fließkommazahlen nie direkt vergleichen

Aufgrund der binären representation ist 1,23 nicht immer exakt 1,23 sondern vll. einmal 1,2299999999999312354 und einmal 1,23000000036737
  Mit Zitat antworten Zitat
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#3

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 10:52
Danke für die schnelle Antwort, das war der entscheidende Hinweis

Mit folgendem Code geht es jetzt

Delphi-Quellcode:
procedure TestMyObject.TestDouble;
var
  Temp: Double;
begin
  FMyObject.D := 4.56;
  Temp := 4.56;
  CheckEquals(Temp, FMyObject.D, 'Wrong Value of D');
end;
Im späteren Programm wird ja dann sowieso alles über Variablen gehen, da passiert mir sowas hoffentlich nicht mehr


Was mich nur jetzt noch verwundert: Der Debugger selbst zeigt wieder "1.23" als Wert an, müsste er dann nicht auch die leicht abweichenden Werte anzeigen? Oder erkennt er, dass es eigentlich 1.23 sein müsste (oder rundet einfach) und zeigt deshalb den richtigen Wert?
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 11:26
hi,

Zitat von Zwoetzen:
Danke für die schnelle Antwort, das war der entscheidende Hinweis

Mit folgendem Code geht es jetzt
...
Im späteren Programm wird ja dann sowieso alles über Variablen gehen, da passiert mir sowas hoffentlich nicht mehr
mir scheint du hast nicht wirklich verstanden, was jfheins versucht hat zu sagen. Lies dir sein Posting nochmal durch und preise dein Glück, dass dir ein schöner Treffer gelungen ist.
Schau dir in dem Zusammenhang die CompareValue-Funktion aus der Unit math an, die wird dir bei deinem Problem helfen können...

Grüße
Lemmy
  Mit Zitat antworten Zitat
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#5

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 12:05
Jetzt hast du mich komplett verwirrt...

Wenn ich den Wert vorher an einen Double zuweise, dann müsste er doch auch die Double-Ungenauigkeit bekommen, oder nicht? Und somit müssten beim Vergleich der beiden Doubles wieder die gleichen Werte sein
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 12:21
Hi,

ich gebe zu, dass ich den Sinn deines beispielhaften Unittests nicht ganz verstehe, gehe aber einfach mal davon aus, dass Du im späteren Betrieb nicht nur eine Wertzuweisung prüfen willst, sondern dass einer der Floats aus einer Berechnung kommt. Und spätestens dann erleidest Du Schiffbruch. Deshalb gibts zumindest für mich 2 eiserne Regeln:
1. Verwende keine Floats wo Currency verwendet werden kann (4 Nachkommastellen reichen (d.h. eine maximale Genauigkeit von 3 Stellen nach dem Komma!) + Wertebereich reicht aus)
2. Vergleiche niemals 2 Floats direkt, sondern immer mit der CompareValue-Funktion.

Das bedeutet vielleicht das eine oder andere mal einen etwas höheren Aufwand, ich weiß aber eins: das kann nicht aufgrund der Float-Ungenauigkeiten irgend wann mal schief laufen, weil irgend jemand eine Methode, eine Klasse, eine Funktion nicht genau so einsetzt wie du es dir gedacht hast.

Grüße
Lemmy
  Mit Zitat antworten Zitat
Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#7

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 13:26
Stimmt, da hast du auch wieder recht. Anfangs war der Test schon komplexer, hatte ihn dann aber vereinfacht, um das Problem zu finden. Und am Ende ist das Double alleine übrig geblieben ^^

Deine 2 Regeln werde ich nun auch befolgen, um solche (unnötigen) Probleme zu umgehen.
(Im aktuellen Projekt greift 1., da ich (zufälligerweise) mit 3 Stellen arbeite ^^)

Danke für eure Antworten
  Mit Zitat antworten Zitat
mjustin

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

Re: [DUnit] Test für Double Property schlägt fehl

  Alt 26. Mär 2009, 14:46
Zitat von Zwoetzen:
Delphi-Quellcode:
procedure TestMyObject.TestDouble;
begin
  FMyObject.D := 1.23;
  CheckEquals(1.23, FMyObject.D, 'Wrong Value of D');
end;
DUnit enthält auch eine passende CheckEquals Methode für diesen Fall:
procedure CheckEquals(expected, actual: extended; delta: extended; msg: string = ''); overload; virtual; Einfach das Delta noch angeben, das maximal erlaubt ist.
Delphi-Quellcode:
procedure TestMyObject.TestDouble;
begin
  CheckEquals(1.23, FMyObject.D, 0.0001, 'Wrong Value of D');
end;
Michael Justin
habarisoft.com
  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 06:30 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