输出原因
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位了)。
查看这个链接,了解为什么浮点数不能存储为精确数字:为什么浮点数不准确?
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何根据单词在文本中出现的概率输出单词