首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreePascal中Max函数的意外结果

FreePascal中Max函数的意外结果
EN

Stack Overflow用户
提问于 2018-08-25 18:29:30
回答 1查看 121关注 0票数 2

运行中的示例非常容易理解:

代码语言:javascript
复制
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,如此小,但仍然出乎意料,并崩溃了我的下面的代码(不是在这里发布,以保持问题清楚和简单)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-25 18:58:51

我应该预先声明,我上一次使用Pascal是在25年前。但出于好奇,我拉下了自由·帕斯卡,并尝试着这样做:

代码语言:javascript
复制
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值并返回相同值的版本。

虽然您可能意识到了这一点,但我还是不得不像往常一样谨慎地注意,像singledouble这样的浮点类型并不总是能够准确地表示您想要它们的值。这是一个很好的概述。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52020129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档