C浮点和双重比较

我在比较C中的简单浮点数和双精度数,特别是两者的值8.7。 现在我为每个变量分配8.7,当我打印时,我得到两个值的8.7000的结果。 为什么编译器添加了这些零。 我想问的主要问题是还有任何我没有看到的数字,如隐藏在尾随零之后的数字。 我读到由于缺乏精确度,我不应该使用float进行这样的比较,但是我认为它具有如此小的值,它确实可以存储8.7,并且需要一定程度的精确度来与另一个8.7值进行比较?

我唯一担心的是它实际上是在内存中的某个位置表示为例如8.70000003758或其他东西,这会让我的比较失败? 我试图使用%.20f打印f以查看可能隐藏的任何其他数字,但我认为只是创建了数字,否则不存在,因为数字的整体精确度变为8.6918734634834929或类似的东西。

我在比较C中的简单浮点数和双精度数,特别是两者的值8.7。

糟糕的选择,因为8.7没有精确的二进制表示。

现在我为每个变量分配8.7,当我打印时,我得到两个值的8.7000的结果。 为什么编译器添加了这些零。

它还没有,你的打印程序有。

我想问的主要问题是还有任何我没有看到的数字,如隐藏在尾随零之后的数字。

当然,因为8.7没有精确的二进制表示。 (尝试将其写为2的整数幂的总和,你不能这样做。)

我读到由于缺乏精确度,我不应该使用float进行这样的比较,但是我认为它具有如此小的值,它确实可以存储8.7,并且需要一定程度的精确度来与另一个8.7值进行比较?

你错了。 1/3很小但没有具有有限位数的精确十进制表示。 值是大还是小与它是否可以用特定基数中的有限位数精确表示无关。

我唯一担心的是它实际上是在内存中的某个位置表示为例如8.70000003758或其他东西,这会让我的比较失败?

确切地说,就像0.333333333代表1/3一样。

我试图使用%.20f打印f以查看可能隐藏的任何其他数字,但我认为只是创建了数字,否则不存在,因为数字的整体精确度变为8.6918734634834929或类似的东西。

那可能只是一个bug。 向我们展示代码。 也许你试图输出一个双重而遗漏了l