防止舍入错误
Preventing Rounding Errors
我刚刚读到c++中的舍入错误。所以,如果我正在制作一个数学密集型程序(或任何重要的计算),我是否应该将所有浮点数放在一起,只使用双精度,或者是否有更简单的方法来防止舍入错误?
必修课:每个程序员都应该知道的浮点算术。
同时,试着阅读IEEE浮点标准。
你总是会得到舍入错误。除非您使用
或者,您可以使用整数算术,仅在需要时转换为浮点数。这仍然很难做到,你必须决定它是否值得。
最后,您可以使用float
或double
,注意不要在表示精度的极限处对值进行假设。我希望这个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只会移动一个小数点。如果没有,也许可以用二进制来表示。
必须在每个不是+、-、*或比较的操作之后应用它。例如,你不能在同一个公式中做两次除法,因为你必须对每个除法应用它。
如果这行不通,你可以通过将数字放大来处理整数,并始终使用整数除法。如果你需要高级函数,也许有一个包可以做确定性整数运算。整数除法在很多金融设置中都是需要的,因为四舍五入的错误容易被利用,就像电影《办公室》中那样。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- C++ 中的舍入函数
- 舍入 QDecDouble 值,精度最多为两个字符
- 将大 int 转换为浮点数,而不舍入 c++
- 舍入错误检测
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 在与C 双打中存储的大整数时,如何避免舍入/精确错误
- 如何防止 C++ 中的舍入错误
- C++Visual Studio学习版2012中的舍入错误
- C++建议中的舍入错误
- 使用整数除法减少舍入错误
- 如何修复此舍入错误
- 防止舍入错误
- 浮点-C++浮点舍入(错误?)