关于浮点数比较有大量的文档和讨论。但是对于我来说,目前尚不清楚能否保证直接比较数字在所有编译器和平台上都能正常工作?精确值的双/浮点比较
double x = 1.;
if (1. == x)
{
//do something
}
我们总是会输入if
块吗?
编辑:
这里什么比较正确的是(永久有效)?这一个?:
double x = 1.;
if (std::abs(1. - x) < std::numeric_limits<double>::epsilon())
{
//do something
}
一些浮点值,例如'1.0',可以用IEEE浮点格式(这是最常用的格式)精确表示。所以你的比较可以在你显示的确切代码中正常工作。但是,尝试在'x'上执行一些操作,*应该*将其保留为'1.0',然后重试比较,并且很可能不起作用。 –
听起来像你应该阅读这个:https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
为了解决你的问题的第二部分,不,'std :: numeric_limits: :epsilon()'不打算像那样使用。 'std :: numeric_limits :: epsilon()'是格式精度的度量,它不是前面计算精度的度量。如果前面的计算可能产生了0.125的绝对误差,并且您希望在数学计算产生1.0时检测出没有误报的测试,请使用std :: abs(1.x)<= 0.125'。在所有情况下,无论上下文如何,RHS都没有可用的神奇价值。 –