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

Bry*_*man 0 c++ math floating-point

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

Aas*_*set 6

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

  • 如果您使用的运算总是导致有限的小数位数(显然不是这样,因为您的数字看起来非常接近sqrt(2)),例如货币计算,则应完全避免使用float / double成本,或者使用固定的精度数据类型(例如,从[GNU多精度算术库](http://gmplib.org/)获得),或者按比例放大所有数字,以便可以使用整数。 (2认同)

Ste*_*non 5

如果你(a)进行数值不稳定的计算(你可能不是),或者(b)稍后会尝试使用严格相等来比较它们,它们只会"引起问题".在一般情况下,你不应该"做什么"这个问题,你应该确保你的算法是不是不精确少量过于敏感.