浮点运算导致数字基本为零

时间:2011-02-23 18:58:07

标签: c++ math floating-point

我正在进行一些计算,当我期待{-0.707107,0,0.707107}时,会产生类似{-0.707107,9.61481e-017,0.707107}的值。第二个组成部分,虽然基本上为零,但会导致问题吗?我该怎么办呢?使用C ++加倍。

4 个答案:

答案 0 :(得分:6)

这在很大程度上取决于你打算做什么。 :-)然而,获得与“数学”结果应该非常接近但不完全相等的结果是使用浮点数时必须要考虑的事情。一个常见的解决方案是定义一些“epsilon”值(比如1e-10)并在所有比较中接受epsilon的错误 - 因此x == y将成为fabs(x - y) < epsilon

答案 1 :(得分:5)

如果你(a)进行数值不稳定的计算(你可能不是),或者(b)稍后会尝试使用严格相等来比较它们,它们只会“引起问题”。一般来说,你不应该对它“做点什么”,你应该确保你的算法对少量的不精确度不过分敏感。

答案 2 :(得分:1)

是的,当使用0.==进行比较时,它们可能会导致问题:这将返回false。正如@driis所指出的,这种舍入错误也可能会累积。

您可以对此做些什么:使用允许舍入错误的比较,和/或在算法中的适当点处丢弃低于合理阈值的值,而不是使用==进行比较。关于你想对这些价值做些什么。

查看有关数值算法的任何好书。

答案 3 :(得分:0)

您只能安全地使用==来比较某些值的浮点数,即使只有在直接指定了这些值时,也不能将其用于任何计算结果。

通常你定义一个函数

bool isEqual(double a,double b) {
  return fabs(a-b) < 0.0000001; // depends on the precision of your application
}

bool isClose(double a,double b) {
  return fabs(a-b) < 0.001;
}