防止舍入错误

Preventing Rounding Errors

本文关键字:错误 舍入      更新时间:2023-10-16

我刚刚读到c++中的舍入错误。所以,如果我正在制作一个数学密集型程序(或任何重要的计算),我是否应该将所有浮点数放在一起,只使用双精度,或者是否有更简单的方法来防止舍入错误?

必修课:每个程序员都应该知道的浮点算术。

同时,试着阅读IEEE浮点标准。

你总是会得到舍入错误。除非您使用

无限任意精度库,如gmplib。您必须决定您的应用程序是否真的需要这种努力。

或者,您可以使用整数算术,仅在需要时转换为浮点数。这仍然很难做到,你必须决定它是否值得。

最后,您可以使用floatdouble,注意不要在表示精度的极限处对值进行假设。我希望这个Valgrind插件被实现(grep for float)…

舍入误差通常是非常微不足道的,即使使用浮点数。像游戏这样的数学密集型程序,需要进行大量的浮点计算,通常仍然使用单精度。

如果你的最大值小于100亿,并且你正在使用c++双精度,这可能会起作用。

if ( ceil(10000*(x + 0.00001)) > ceil(100000*(x - 0.00001))) { 
    x = ceil(10000*(x + 0.00004)) / 10000; 
}

至少允许最后一位数字为+/- 9。我假设除以1000只会移动一个小数点。如果没有,也许可以用二进制来表示。

必须在每个不是+、-、*或比较的操作之后应用它。例如,你不能在同一个公式中做两次除法,因为你必须对每个除法应用它。

如果这行不通,你可以通过将数字放大来处理整数,并始终使用整数除法。如果你需要高级函数,也许有一个包可以做确定性整数运算。整数除法在很多金融设置中都是需要的,因为四舍五入的错误容易被利用,就像电影《办公室》中那样。