#include <stdio.h>
int main(void){
float a = 1.1;
double b = 1.1;
if(a == b){
printf("if block");
}
else{
printf("else block");
}
return 0;
}
打印:else阻止
#include <stdio.h>
int main(void){
float a = 1.5;
double b = 1.5;
if(a == b){
printf("if block");
}
else{
printf("else block");
}
return 0;
}
打印:if block
这背后的逻辑是什么?
使用的编译器:gcc-4.3.4
答案 0 :(得分:6)
这是因为1.1
在二进制浮点中不能完全表示。但1.5
是。
因此,float
和double
表示形式的1.1
值略有不同。
这里写的是二进制浮点时的区别:
(float) 1.1 = (0.00011001100110011001101)₂
(double)1.1 = (0.0001100110011001100110011001100110011001100110011010)₂
因此,当您比较它们(并且float
版本被提升)时,它们将不相等。
答案 1 :(得分:4)
答案 2 :(得分:1)
二进制1.1十进制的精确值是非结束分数1.00011001100110011001100(1100)....双常数1.1
是53位截断/ 尾数的近似值 。现在转换为float时,尾数将仅以 24 位表示。
当float
转换回双倍时,尾数现在又回到了53位,但超过24的数字的所有内存都会丢失 - 该值是零扩展的,现在你正在比较(例如,取决于舍入行为)
1.0001100110011001100110011001100110011001100110011001
和
1.0001100110011001100110000000000000000000000000000000
现在,如果您使用的是1.5而不是1.1;
1.5十进制正好 1.1二进制。它可以精确地呈现在 2 位尾数中,因此即使24位浮点数也是夸张的......你所拥有的是
1.1000000000000000000000000000000000000000000000000000
和
1.10000000000000000000000
后者,零扩展为双倍
1.1000000000000000000000000000000000000000000000000000
显然是相同的数字。