![]() |
DUnit und Fließkommazahlen Problem
Hallo,
für eine DUnit Demo schreibe ich gerade einen einfachen Taschenrechner und laufe jetzt aber bei den unit Tests in Fließkomma Probleme. Der Taschenrechner hat 2 Operanden 1 und 2, die jeweils ein Double sind. Ich schriebe einen DUnit Tests mit dem Inhalt:
Delphi-Quellcode:
Der Test schlägt fehl mit der Meldung, dass 4.6 erwartet würde und der Wert von Operand1 4.6 wäre :?
procedure TestTCalculatorLogic.TestSetOperand1Positive;
begin FCalculatorLogic.Operand1 := 4.6; CheckEquals(4.6, FCalculatorLogic.Operand1); end; Ja ich weiß, FLießkommazahlen sind nicht unendlich präzise und DUnit's CheckEquals nutzt Extended als Übergabeparameter, aber sollte das nicht für eine Nachkommastelle trotzdem funktionieren? Und sollte nicht die Fehlermeldung, falls es wirklich irgendwo weiter hinten bei den Nachkommastellen dadurch Differenzen gibt, die genaue Zahl im Text nennen? Was sind meine Möglichkeiten diese Demo umzubauen. so dass ich nicht in diese Probleme laufe? Umstellen von Double auf Currency, damit hat man zwar nur 4 Nachkommastellen, aber keine Präszisions- probleme dieser Art? Grüße TurboMagic |
AW: DUnit und Fließkommazahlen Problem
Zitat:
4.6 hat, dezimal ausgedrückt, zwar nur eine Nachkommastelle, binär ausgedrückt aber "unendlich" viele Nachkommastellen. Wie sieht denn die Funktion CheckEquals aus? Vorschlag: Benutze die Funktion SameValue aus System.Math.
Delphi-Quellcode:
var V:Double; Res:Boolean;
begin V:=4.6; Res:=SameValue(4.6,V); // Res ist True end; |
AW: DUnit und Fließkommazahlen Problem
CheckEquals nutzt intern kein SameValue, sondern vergleicht selber
Delphi-Quellcode:
(abs(expected-actual) > delta) then
Es gibt ein CheckEquals mit Delta-Parameter ... benutze das und verwende z.B. die Konstante ExtendedResolution, DoubleResolution, SingleResolution oder was Eigenes, wie 0.0000001.
Delphi-Quellcode:
CheckEquals(4.6, FCalculatorLogic.Operand1, SingleResolution);
Genauso, wie bei SameValue, kommt als Default-Parameter eine 0 rein, aber SameValue nutzt bei 0 nicht wirklich 0, sondern z.B. ExtendedResolution. |
AW: DUnit und Fließkommazahlen Problem
Verwende besser DUnitX, nicht mehr DUnit.
Das DUnit im Delphi 11.2 ist scheinbar 11 Jahre alt und selbst ![]() Wobei DUnitX, im Delphi mitgeliefert, ist auch 7 Jahre alt :wall:, also besser gleich von ![]() ich wüsste jetzt nichtmal, wo man hier die Fehler melden sollte. (von ![]() alleine diese eine Funktion: Zitat:
|
AW: DUnit und Fließkommazahlen Problem
Danke für all die Tipps.
@himtsu: wo hast du die DoubleResolution Konstante her? In System.Math is eine drin, aber im implementation Teil?! Wäre es nicht nützlich diese im Interface Teil zu haben? |
AW: DUnit und Fließkommazahlen Problem
Aus SameValue kopiert :stupid: .... echt mal, hätte nicht damit gerechnet, dass die selbst sowas nicht öffentlich deklariert haben :wall:
|
AW: DUnit und Fließkommazahlen Problem
|
AW: DUnit und Fließkommazahlen Problem
Bin grade auf die Idee gekommen eine neue Unit bei mir einzuführen.
h5u.stuffthatEmbarcaderoistooslowtoimplementthemselvesismorbidlyhidingortoostupidtofix.pas und alles, was nur wegen ihrer Unfähigkeit existiert, dort reinzuschieben. ![]() für zwei fehlende Zeilen (Variablen auf 0 setzen), existiert bei uns nun ein Package, was in der IDE sich böse in das Laden der DFMs hookt und im Programm sich beim TReader einschleicht. |
AW: DUnit und Fließkommazahlen Problem
Zitat:
bei der DP voll ist! :lol: Kannst du das mal bitte zumindest etwas leeren? |
AW: DUnit und Fließkommazahlen Problem
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 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