运行中的示例非常容易理解:
program Project1;
uses
SysUtils, Math;
var
fValue: double;
fValueMax: double;
begin
fValue := 7.0207503445953527;
fValueMax := Max(0, fValue);
writeln(fValue);
writeln(fValueMax);
readln;
end. 然而,结果是完全出乎意料的。由于某些原因,Max函数不仅会从两个参数返回较大的数字,而且还会更改它的值。
在上面的示例代码中,fValueMax的期望值正是fValue,但是fValueMax更大。差别大约是E-7,如此小,但仍然出乎意料,并崩溃了我的下面的代码(不是在这里发布,以保持问题清楚和简单)。
发布于 2018-08-25 18:58:51
我应该预先声明,我上一次使用Pascal是在25年前。但出于好奇,我拉下了自由·帕斯卡,并尝试着这样做:
program Project1;
uses
SysUtils, Math;
var
fValue: double;
fValueMax: double;
fSingle: single;
fValue2: double;
fValue2b: double;
fValueMax2: double;
begin
fValue := 7.0207503445953527;
fSingle := 7.0207503445953527;
fValueMax := Max(0, fValue);
writeln(fValue); // prints 7.0207503445953527E+000
writeln(fValueMax); // prints 7.0207505226135254E+000
writeln(fSingle); // prints 7.020750523E+00
fValue2 := 7.0207503445953527;
fValue2b := 0.0;
fValueMax2 := Max(fValue2b, fValue2);
writeln(fValue2); // prints 7.0207503445953527E+000
writeln(fValueMax2); // prints 7.0207503445953527E+000
readln;
end.我的前两个writeln命令显示了与您报告看到的结果相同的结果。我怀疑Max返回的值可能不像您期望返回的double那样精确,所以我创建了fSingle,并将其分配给了您分配给fValue的文本,而且果然,它的值看起来非常接近于您在fValueMax中得到的内容。
最后,我没有使用Max调用fValue和文字0,而是使用double类型的两个变量调用它,其中一个变量设置为0.0。在这种情况下,您可以看到输入(fValue2)和输出(fValueMax2)具有完全相同的值。因此,虽然我不知道Pascal的规则究竟是什么来决定调用哪个重载,但我不知道您对Max的最初调用是否以某种方式解析了使用两个single值并返回相同值的版本。
虽然您可能意识到了这一点,但我还是不得不像往常一样谨慎地注意,像single和double这样的浮点类型并不总是能够准确地表示您想要它们的值。这是一个很好的概述。
https://stackoverflow.com/questions/52020129
复制相似问题