Math.pas 单元包括处理浮动类型比较和相等的函数,例如 SameValue()、IsZero()、CompareValue()。
const
EPSILON = 0.0000001;
begin
if CompareValue(p, pMax, EPSILON) = GreaterThanValue then
ShowMessage('p greater than pMax');
常量GreaterThanValue在Types.pas中定义
如果您要比较非常大的值,您不应为 epsilon 使用常量,而应根据您要比较的值计算 epsilon 值。
var
epsilon: double;
begin
epsilon := Max(Min(Abs(p), Abs(pMax)) * 0.000001, 0.000001);
if CompareValue(p, pMax, epsilon) = GreaterThanValue then
ShowMessage('p greater than pMax');
请注意,如果您使用CompareValue(a, b, 0) 或在XE2 及更高版本中使用CompareValue(a, b),Delphi 会自动为您填写一个好的epsilon。
来自德尔福Math单位:
function SameValue(const A, B: Extended; Epsilon: Extended): Boolean;
begin
if Epsilon = 0 then
Epsilon := Max(Min(Abs(A), Abs(B)) * ExtendedResolution, ExtendedResolution);
if A > B then
Result := (A - B) <= Epsilon
else
Result := (B - A) <= Epsilon;
end;
从 Delphi XE2 开始,现在所有这些函数都有重载,不需要 epsilon 参数而是为您计算一个(类似于为 epsilon 传递 0 值)。为了代码清晰,我建议调用这些更简单的函数并让 Delphi 处理 epsilon。
不使用没有 epsilon 参数的重载的唯一原因是当性能至关重要并且您希望避免重复计算 epsilon 的开销时。