![]() |
Delphi-Version: 5
System.Math.InRange(..) mit Epsilon?
Wenn man Fließkommazahlen mit einer bestimmten Genauigkeit vergleichen will macht man das z.B. so:
Delphi-Quellcode:
Wenn ich schauen will ob Zahl c zwischen a und b liegt kenne ich
uses System.Math;
const epsilon = 1E-2; begin if SameValue(a, b, epsilon) then [...] end; ![]()
Delphi-Quellcode:
Ich kann aber nirgendwo ein Epsilon angeben. Wenn
uses System.Math;
begin if InRange(meineZahl, 10.5, 75.6) then [...] end;
Delphi-Quellcode:
nun
meineZahl
Delphi-Quellcode:
ist, schlägt die Überprüfung fehl. Mir als Mensch ist es allerdings genau genug ;-)
10.499999999999
Meine Frage: Gibt es da nichts fertiges in der Standard-Bibliothek? Unter ![]() |
AW: System.Math.InRange(..) mit Epsilon?
Man war einfach der Meinung, dass niemand sowas braucht.
Delphi-Quellcode:
Gut, das "Epsilon" hab ich hier bissl "minimiert" ... man darf es gern für AMin und AMax jeweils entsprechend den Berechnungen in SameValue berechnen, bzw.
if InRange(meineZahl, 10.5-, 75.6+DoubleResolution) then
// oder function InRange(const AValue, AMin, AMax: Double): Boolean; begin Result := (AValue+DoubleResolution >= AMin) and (AValue-DoubleResolution <= AMax); end; // oder function InRange(const AValue, AMin, AMax: Double): Boolean; begin Result := InRange(AValue, AMin-DoubleResolution, AMax+DoubleResolution); end;
Delphi-Quellcode:
InRange bekommt alle Parameter in Registern, die theoretisch auch in der Funktion nicht auf den Stack wandern müssten, falls der Compiler "schlau" genug ist.
function InRange(const AValue, AMin, AMax: Double): Boolean;
begin Result := System.Math.InRange(AValue, AMin, AMax) or SameValue(AValue, AMin) or SameValue(AValue, AMax); end; Mit einem 4. Parameter für Epsilon und vorallem auch den internen Berechnungen, für ein fehlendes Epsilon, ist das definitiv nicht mehr möglich. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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 by Thomas Breitkreuz