C浮点和双重比较

时间:2016-02-01 22:30:37

标签: c floating-point double precision floating-accuracy

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

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

1 个答案:

答案 0 :(得分:3)

  

我在比较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或类似的东西。

这可能只是一个错误。告诉我们代码。也许你试图输出一个双倍而忽略了l