输出原因

Reason for output?

本文关键字:输出      更新时间:2023-10-16

考虑以下两个片段

int main() {
    float a = 1.5;
    if(a == 1.5) cout << "Yesn";
    else cout << "Non";
    return 0;
}

输出:Yes.

int main() {
    float a = 0.7;
    if(a == 0.7) cout << "Yesn";
    else cout << "Non";
    return 0;
}

输出:没有。

为什么两种情况下的输出不同?我知道默认情况下浮点常量是双精度的,所以在第二个代码片段中,float (a)和double(0.7)之间的比较变为false,输出为No。但是我不能弄清楚为什么在第一个片段的情况下输出是Yes。请帮助!

这样做的原因是大多数浮点数在计算机中不是以精确的值存储的。所以在浮点数上使用相等性从来都不是一个好主意。您应该做的是检查两个浮点数之间的差是否小于阈值。比如:

if (abs(a - 0.7) < 0.00001)
  cout << "Yes" 
else
  cout << "No"

在前面的例子中等式成立的原因是1.5可以精确地表示为浮点数,而0.7不能。要理解其中的原因,您应该看看浮点数在内存中的存储方式。另一种思路是,1.5的二进制表示形式是小数之前的部分为1,小数之后的部分为1,而二进制中的0.7在小数之后将有一个永不终止的序列。如果你不能把它写在纸上,你怎么能指望在内存中存储所有这些无限的比特(更不用说64位了)。

查看这个链接,了解为什么浮点数不能存储为精确数字:为什么浮点数不准确?