在我的C++代码中,我面临着浮点精度问题
给定double d = 32.4;
d / 0.01 == 3240.0;给出真实,而
d / 0.1 == 324.0是假的。
但是如果我乘以10和100,那么结果都是正确的。
因为32.4,324和3240都可以用64位双倍表示,没有任何精度损失,所以这个结果让我很困惑。(我不太熟悉浮点乘法器和除法运算)
在我的用例中,我将通过简单地乘以或除以0.1、0.01、0.05这样的东西,在不同的标度之间进行一些转换。我的意思是,我不需要很高的精度,我的操作数通常小于6小数位,可以用64位双倍表示,而不需要精度损失,所以我想得到一致的结果。我猜想:在我的用例中,应该总是使用乘而不是除法吗?
发布于 2019-05-31 19:35:02
您似乎误解了浮点类型可以表示什么值。
值32.4 不能用任何二进制浮点格式精确表示,0.1或0.01也不能表示。它看起来像是一个重复的小数。它与值1/3相同,也不能用十进制格式,即0.3333333333333.因此,任何带有这些值的算术都不是精确的。
在这种情况下,您可以做的最好的事情是将浮点值的除法改为整数值ex的乘法。/ 0.1 -> * 10.即使这样,结果也不会准确,因为原始值32.4不能精确表示。您需要将结果舍入一个整数值,才能得到精确的结果。
https://stackoverflow.com/questions/56400746
复制相似问题