是C程序的正确输出

时间:2011-10-12 12:18:23

标签: c

  

可能重复:
  Floating point comparison

我有简单的c代码,输出对我来说意外

main()

{

  float f1 = 1.0;

  double f2 = 1.0;

  if(f1==f2)

 printf("Equal");

 else

  printf("unequal");

  }

我期待输出“不相等”但输出相等。为什么呢?

由于float和double具有不同的精度,因此输出应该是不相等的。

3 个答案:

答案 0 :(得分:8)

精度仅在数字无法准确表示时才有意义。由于浮点数和双精度数(IEEE 754单精度值和双精度值)都可以精确地表示1.0,因此不会出现精度。

1.0基本上是零符号位,除了最高设置为1之外的所有指数位,并且没有设置尾数位。在单精度中,这是二进制:

0-01111111-00000000000000000000000

和,对于双精度:

0-01111111111-0000000000000000000000000000000000000000000000000000

并非所有数字都可以在IEEE 754中完全表示 - 例如,您在评论中提到的1.1实际上以单精度存储为1.100000023841858

有关解码浮点值的示例,请查看this answer

如果您想了解格式,

Harald Schmidt's online single-precision converter是一个很好的网站。我非常喜欢它,我制作了一个桌面版本以防它消失(并且能够做到双精度)。

答案 1 :(得分:2)

它不是类型,它是它所比较的​​值,并且在这种特定情况下不会发生近似误差,因此它们是相等的。 Float具有单精度IEEE754格式,double具有双精度格式,并且在两种格式中,近似值都相同,并且不会发生错误。您可以获取一些小数值,这些小数值不能通过float存储,而是通过double存储,并使用您的代码进行测试。这种比较不应该在实际代码中完成,因为溢出和逼近错误会意外地分支执行(例如循环中的浮点比较)。

答案 2 :(得分:1)

尝试使用例如.3执行相同的操作。当数字在基数2表示中是周期性时出现问题。在任何情况下,比较双重和/或浮动是不正确的,但我想你已经知道你的问题。