Friday, 19 June 2009

Comparando reales con Delphi

Delphi no permite hacer comparación con floats directamente. Hay que hacer la comparación mediante un margen 1e-6 por ejemplo u otro dependiendo del margen que necesitemos. Para eso, Delphi dispone de una función llamada CompareValue que nos permite comparar dos valores reales mediante el margen de diferencia y nos devuelve un registro indicando si es más pequeño, igual o más grande. Yo he creado una pequeña función que adapta este método para hacerlo un poco más fácil de utilizar. Hago la comparación igual, pero utilizando un método de comparación mediante String, pasando el operando de comparación '='.




uses
Math, Types;

function Compare(Value1, Value2: double; MethodComp: string): boolean; overload;

const
RealMargin = 0.000001; //1e-6

implementation

function
Compare(Value1, Value2: double; MethodComp: string): boolean;
var
ret: boolean;
begin
ret := false;
if MethodComp = '=' then
begin
case CompareValue(Value1, Value2, RealMargin) of
EqualsValue: ret := true;
end;
end
else if MethodComp = '>=' then
begin
case CompareValue(Value1, Value2, RealMargin) of
EqualsValue: ret := true;
GreaterThanValue: ret := true;
end;
end
else if MethodComp = '>' then
begin
case CompareValue(Value1, Value2, RealMargin) of
GreaterThanValue: ret := true;
end;
end
else if MethodComp = '<=' then
begin
case CompareValue(Value1, Value2, RealMargin) of
LessThanValue: ret := true;
EqualsValue: ret := true;
end;
end
else if MethodComp = '<' then
begin
case CompareValue(Value1, Value2, RealMargin) of
LessThanValue: ret := true;
end;
end;
result := ret;
end;



0 comments:

Post a Comment