gpt4 book ai didi

delphi - delphi中如何比较 double ?

转载 作者:行者123 更新时间:2023-12-03 14:33:33 24 4
gpt4 key购买 nike

我们面临数据类型双重比较的问题:

if(p > pmax) then
begin
Showmessage('');
end

如果两个值都是 100(p=100 且 pmax = 100),那么它也会进入 if 子句。

最佳答案

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为你。

来自 Delphi 数学单元:

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 的开销时。

关于delphi - delphi中如何比较 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6106119/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com