c++ - float 倍数和除法精度问题

标签 c++ c floating-point precision

<分区>

我在 C++ 代码中遇到浮点精度问题

给定 double d = 32.4;

d / 0.01 == 3240.0;

给出 true,而

d / 0.1 == 324.0

给出错误。

但如果我乘以 10 和 100,那么结果都为真。

由于32.4、324、3240都可以用64bit double来表示,没有任何精度损失,所以这个结果让我很迷惑。 (我对 float 的乘除运算不是很熟悉)

在我的用例中,我将通过简单地乘以或除以 0.1、0.01、0.05 之类的值来在不同比例之间进行一些转换。我的意思是,我不需要非常高的精度,我的操作数通常少于 6 位小数,可以用 64 位 double 表示而不会丢失精度,所以我想得到一致的结果。我有一个猜测:在我的用例中,我是否应该总是使用乘法而不是除法

最佳答案

您似乎误解了浮点类型可以表示什么值。

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

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

关于c++ - float 倍数和除法精度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56400746/

相关文章:

c - MISRA 违规 12.9 一元减号的操作数未签名

c - 将 b 声明为指向 int 数组 10 的指针的目的是什么

python - 字典记录在打印时被截断

c# - 计算 double 最后一位 (ULP) 的单位

c++ - C++ 中堆栈溢出和段错误的危险

c++ - 将参数传递给 void(*)(void*)

c++ - 高级 iOS GUI(最好使用 C++)

c++ - 试图重载 << 运算符,但出现错误

c - 链表的回文校验

performance - 哪些 CPU 状态对 Intel FPU 和 SSE 性能有影响?