防止舍入错误

时间:2011-07-20 09:43:01

标签: c++ rounding-error

我刚刚读到了关于C ++中的舍入错误。所以,如果我正在制作一个数学紧张的程序(或任何重要的计算),我应该将所有浮点数放在一起并仅使用双打,还是有更简单的方法来防止舍入错误?

3 个答案:

答案 0 :(得分:7)

强制性讲座:What Every Programmer Should Know About Floating-Point Arithmetic

另外,请尝试阅读IEEE Floating Point standard

你总会得到四舍五入的错误。除非您使用无限任意精度库,例如gmplib。你必须决定你的应用程序是否真的需要这种努力。

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

最后,您可以使用floatdouble注意不要在表示精度的限制下对值进行假设。我希望实现this Valgrind plugin(grep for float)......

答案 1 :(得分:1)

即使使用浮点数,舍入误差通常也非常微不足道。数学上强烈的程序,如游戏,进行大量的浮点计算,通常仍然使用单精度。

答案 2 :(得分:0)

如果你的最高数字少于100亿而你正在使用C ++双精度,这可能会有用。

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

这应该允许至少最后一个数字关闭+/- 9.我假设除以1000将始终只移动小数位。如果没有,那么也许它可以用二进制完成。

在每次不是+, - ,*或比较的操作之后,您必须应用它。例如,您不能在同一个公式中进行两个分区,因为您必须将它应用于每个分区。

如果这不起作用,您可以通过缩放数字来处理整数,并始终使用整数除法。如果您需要高级功能,可能会有一个确定整数数学的包。在许多财务设置中需要整数除法,因为像电影“办公室”一样可以利用舍入错误。