浮点倍数和股息精度问题

float point multiple and divident precision problem

本文关键字:精度 问题      更新时间:2023-10-16

我在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 位双精度表示而不会损失精度,所以我想得到一致的结果。我有一个猜测:在我的用例中,我应该总是使用乘法而不是除法吗?

您似乎对浮点类型可以表示的值有误。

值 32.4 不能用任何二进制浮点格式精确表示,0.1 或 0.01 也不能。 它看起来像一个重复的小数。 它与值 1/3 相同,也不能以十进制格式精确表示,即 0.3333333333333.... 因此,具有这些值的任何算术都不会精确。

在这种情况下,您可以做的最好的事情是将浮点值的除法更改为整数值的乘法,例如。 / 0.1 --> * 10 . 即使这样,结果也不会准确,因为无法准确表示 32.4 的原始值。 您需要将结果四舍五入为整数值才能获得准确的结果。