Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   System.Math.InRange(..) mit Epsilon? (https://www.delphipraxis.net/191183-system-math-inrange-mit-epsilon.html)

Der schöne Günther 16. Dez 2016 19:03

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:
uses System.Math;

const
   epsilon = 1E-2;
begin
   if SameValue(a, b, epsilon) then [...]
end;
Wenn ich schauen will ob Zahl c zwischen a und b liegt kenne ich InRange:
Delphi-Quellcode:
uses System.Math;

begin
   if InRange(meineZahl, 10.5, 75.6) then [...]
end;
Ich kann aber nirgendwo ein Epsilon angeben. Wenn
Delphi-Quellcode:
meineZahl
nun
Delphi-Quellcode:
10.499999999999
ist, schlägt die Überprüfung fehl. Mir als Mensch ist es allerdings genau genug ;-)

Meine Frage: Gibt es da nichts fertiges in der Standard-Bibliothek?

Unter Vergleichsroutinen habe ich sonst nichts gefunden...

himitsu 16. Dez 2016 20:20

AW: System.Math.InRange(..) mit Epsilon?
 
Man war einfach der Meinung, dass niemand sowas braucht.

Delphi-Quellcode:
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;
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.
Delphi-Quellcode:
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;
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.
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 13:01 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