代码之家  ›  专栏  ›  技术社区  ›  Doc Brown

如何处理浮点舍入问题?

  •  0
  • Doc Brown  · 技术社区  · 14 年前

    看到 this post about floating point errors on slashdot ,我很好奇 对于这种浮点舍入误差,还有其他的解决方法。那么,你从中学到最多的浮点错误是什么,你从中学到了什么?

    编辑:我在一个项目中工作,我们必须处理很多浮点运算,所以我希望得到一些答案,可能有助于我避免一些事情成为问题之前。我会接受这个答案,它给了我最新的见解,而不是“用一个epsilon来比较每件事”。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Potatoswatter    14 年前

    尽量避免增加不同震级的数字。例如, 10^8+1==10^8 在单精度算法中。你可以通过移动到双精度来解决这个问题,但是 10^8+1.00000001==10^8+1 分数会丢失。

    如果所有进入线性代数的数字都有偏,首先去掉偏。所以,给定 1000001, 1000003.9, 1000002.5, … ,做任何事情前减去100万,最后再加上。

    若要对一个非常大的小数字序列求和,请先对较小的子序列求和,以使末尾的数字不会过度舍入。

    要将一个非常大的数字序列相乘,请将它们的对数相加,以避免上溢或下溢。

        2
  •  1
  •   John Källén    14 年前

    我学会了永远不要为了平等而比较两个浮点数。相反,我总是试图用我的逻辑来表达,以便比较总是小于或大于条件。把一个浮点数与零相比较是特别讨厌的。

        3
  •  -1
  •   mpen    14 年前

    我不认为你真的需要担心,除非你处理的是非常小和/或非常大的数字…如果有问题,可以使用某种“十进制”类,或者选择更稳定的算法。

    我不认为这在过去真的咬过我,但当它发生在我的一个同龄人身上时,我很兴奋,我知道到底是什么错了:D