我只是在阅读有关 C++ 中的舍入错误的信息。所以,如果我正在制作一个数学密集型程序(或任何重要的计算),我应该把浮点数放在一起并只使用双精度数还是有更简单的方法来防止舍入错误?
问问题
6269 次
3 回答
8
必修课:每个程序员都应该知道的浮点运算知识。
另外,请尝试阅读IEEE 浮点标准。
你总是会得到舍入错误。除非你使用无穷任意精度库,例如gmplib。您必须决定您的应用程序是否真的需要这种努力。
或者,您可以使用整数算术,仅在需要时转换为浮点数。这仍然很难做到,您必须决定是否值得。
最后,您可以使用float
或double
注意不要对表示精度限制的值进行假设。我希望这个 Valgrind 插件被实现(grep for float)......
于 2011-07-20T09:55:14.180 回答
1
舍入误差通常非常微不足道,即使使用浮点数也是如此。像游戏这样的数学密集型程序,它们进行大量的浮点计算,通常仍然使用单精度。
于 2011-07-20T09:58:54.057 回答
0
如果您的最高数字小于 100 亿并且您使用的是 C++ 双精度,这可能会起作用。
if ( ceil(10000*(x + 0.00001)) > ceil(100000*(x - 0.00001))) {
x = ceil(10000*(x + 0.00004)) / 10000;
}
这应该至少允许最后一位数字偏离 +/- 9。我假设除以 1000 将始终只移动一个小数位。如果没有,那么也许可以用二进制完成。
您必须在每个不是 +、-、* 或比较的操作之后应用它。例如,您不能在同一个公式中进行两个除法,因为您必须将其应用于每个除法。
如果这不起作用,您可以通过按比例放大数字并始终使用整数除法来处理整数。如果您需要高级功能,也许有一个包可以进行确定性整数数学。在许多财务环境中都需要整数除法,因为四舍五入错误会像电影“办公室”中一样受到利用。
于 2018-05-31T18:23:19.140 回答