Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: System.Math.InRange(..) mit Epsilon?

  Alt 16. Dez 2016, 21:20
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.
$2B or not $2B

Geändert von himitsu (16. Dez 2016 um 22:21 Uhr)
  Mit Zitat antworten Zitat