德尔福数学: Why is 0. 7<0.70?

标签 delphi math comparison floating-point types

如果我有 double 类型的变量 a、b、c,令 c:=a/b,并给 a 和 b 值分别为 7 和 10,则 c 的值 0.7 将注册为小于 0.70。

另一方面,如果变量都是类型扩展的,则 c 的值 0.7 不会注册为小于 0.70。

这看起来很奇怪。我缺少什么信息?

最佳答案

首先需要注意的是,Delphi 中的浮点文字是扩展类型。因此,当您将 double 与文字进行比较时, double 可能首先“扩展”为扩展,然后进行比较。 (编辑:这仅在 32 位应用程序中有效。在 64 位应用程序中,ExtendedDouble 的别名)

这里会显示所有的ShowMessage。

procedure DoSomething;
var
  A, B : Double;
begin
  A := 7/10;
  B := 0.7; //Here, we lower the precision of "0.7" to double

  //Here, A is expanded to Extended...  But it has already lost precision. This is (kind of) similar to doing Round(0.7) <> 0.7
  if A <> 0.7 then 
    ShowMessage('Weird');

  if A = B then //Here it would work correctly.
    ShowMessage('Ok...');

  //Still... the best way to go...
  if SameValue(A, 0.7, 0.0001) then
    ShowMessage('That will never fails you');
end;

这里有一些文献供您引用

What Every Computer Scientist Should Know About Floating-Point Arithmetic

关于德尔福数学: Why is 0. 7<0.70?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2754240/

相关文章:

python - 在表的特定列中搜索不匹配的项目

sockets - 如何使用 Winsock api 检查互联网连接?

javascript - 使用 Javascript 计算边界框

两个大目录的比较

python - 在给定时间/样本量下,频率 f1 和 f2 之间呈指数变化的正弦波

math - tensorflow 是否使用自动或符号渐变?

c - 使用我的代码,我返回了不止一行 "smallest is"行或 "largest is"行……我的错误在哪里?

delphi - 如何创建实时递增值的 slider

ios - 为什么我们需要对 Objective-C 对象字段进行保留?

delphi - 虚拟 TreeView 中可以有多个扩展节点吗?