有时候,我在C++中使用浮点数时发生了一些情况,并且只将数字用作0.1的倍数,作为for循环中的增量,实际的数字是循环迭代器并不完全是0.1的倍数,但具有不可预知的其他增加或减少1^-17数量级的微小数字。我怎样才能避免这种情况?在使用浮点数时避免不稳定的小数字
0
A
回答
6
不要遍历浮点数。
问题是0.1不能完全用浮点数表示。因此,您应该这样做:
for (int i = 0; i < N; i++)
{
float f = i * 0.1f;
...
}
+2
最好的部分是,因为他每次都加上'0.1',即使他得到一个逻辑上应该完全可以表示的数字(例如'1.0'),他也不会有这样的机会。所以像'for(float f = 0.0f; f <1.0; f + = 0.1f)'这样的行可能最终只会迭代9次。 – corsiKa
7
1
这是关于浮标工作的excellent article。有一个涵盖正是你们的榜样的讨论 - 0.1的增量:
for (double r=0.0; r!=1.0; r+=0.1) printf("*");
几颗星莫非要打印吗?十?运行它,并感到惊讶。代码只是继续打印星星,直到我们打破它。
问题在哪里?正如我们已经知道的那样,双打并不是无限精确的。我们在这里遇到的问题如下:在二进制中,0.1的表示不是有限的(因为它在基数10中)。十进制0.1相当于二进制0.0(0011),其中圆括号中的部分永远重复。当0.1存储在双变量中时,它会四舍五入到最接近的可表示值。因此,如果我们将其添加10次,结果不完全等于1。
我强烈建议阅读整篇文章,如果你工作了很多浮点数。
相关问题
- 1. 目的c:解析字符串为浮点数,避免额外的小数点
- 2. 正则表达式(避免浮点数)
- 3. 浮点稳定性
- 4. ostringstream打印浮点数在固定符号避免scentific符号
- 5. 如何避免多次使用'isnan'来过滤不稳定的数据集?
- 6. 数字不稳定
- 7. 避免使用数组的大小c#
- 8. 避免浮点运算
- 9. 避免浮点溢出?
- 10. 避免小数字科学记数法
- 11. 使用IPython时避免小数字错误
- 12. 如何确定浮点数中小数点右边的数字?
- 13. PHP:带小数点的字符串在转换为浮点数时带小数
- 14. 自定义小数点浮点数
- 15. 在小数点后的浮点数中设置数字
- 16. 如何在TCL中避免浮点太小误差
- 17. 避免差距显卡采用浮点数C#
- 18. 如何避免在Python中舍入浮点数?
- 19. 小数位数浮点数
- 20. 在PHP中使用microtime和浮点数不精确的数字
- 21. 避免大数据在MVC重定向而不使用TempData的
- 22. 使用递归函数时避免字符串+整数加法
- 23. 将小数位数多的浮点数转换为浮点数只有一个小数位的浮点数
- 24. 避免科学记数法浮动
- 25. 将小数点后的小数点后的字符串转换为浮点数
- 26. 避免假定包含浮点类型的结构的扩展数据块?
- 27. 如何避免浮点错误?
- 28. 测量浮点数列表的波动性或稳定性
- 29. 只有在需要时浮点数的Jython小数位数
- 30. 浮点数字
不要使用浮点来迭代? – Pubby
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html –
不要使用*非精确*浮点来迭代。使用IEEE 754二进制数字时,像0.125这样的确切数字就可以得到更好的效果(当然,只要您保持在足够大的数字范围内)。 – kennytm