我有简单的c代码,输出对我来说意外
main()
{
float f1 = 1.0;
double f2 = 1.0;
if(f1==f2)
printf("Equal");
else
printf("unequal");
}
我期待输出“不相等”但输出相等。为什么呢?
由于float和double具有不同的精度,因此输出应该是不相等的。
答案 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表示中是周期性时出现问题。在任何情况下,比较双重和/或浮动是不正确的,但我想你已经知道你的问题。