有很多关于 float 比较的文档和讨论。但就我而言,不清楚能否始终保证数字的直接比较适用于所有编译器和平台?
double x = 1.;
if (1. == x)
{
//do something
}
我们会一直进入if
block 吗?
已编辑:
这里哪个比较是正确的(总是有效)?这个?:
double x = 1.;
if (std::abs(1. - x) < std::numeric_limits<double>::epsilon())
{
//do something
}
最佳答案
是的,像这样的直接比较——没有中间操作——总是有效的。为浮点文字存储的位模式是浮点系统(几乎总是 IEEE-754)可表示的最接近的位模式。所以测试 1.0 == 1.0
将始终有效,因为位模式是 1.0 的位模式;并且 0.3 == 0.3
将也始终有效,因为在这两种情况下,位模式——虽然不完全是 0.3——是最接近 0.3 的可表示数字。
至于 epsilon,请远离机器 epsilon,直到您真正了解它代表什么以及它的用途。机器epsilon是相对的,不是绝对的;并使用它来比较“足够接近”需要了解各种操作会引入多少错误。有趣的是,在您的特定情况下,这两个测试实际上是相同的:只有 1.0 才能通过测试。
关于c++ - 与精确值的 double / float 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40990187/