请考虑以下代码:
float x = 0.1;
if ( x> 0.1){
printf("if");
}
现在,当我检查相等性时,解释了x通过在末尾填充0来转换为double,但是RHS上的0.1存储为double,因此不等式。 但是,如果我遵循这个逻辑,那么" if"在上面的代码中应该给出错误,但事实确实如此。 为什么呢?
答案 0 :(得分:7)
(限制对IEEE754的回答虽然C支持的所有浮点方案都要求double
集是float
集的超集。)
0.1
是0.1000000000000000055511151231257827021181583404541015625
0.1f
是0.100000001490116119384765625
。
0.100000001490116119384765625
被提升为double
,但它与所有float
完全相同的数字可以表示为double
。
因此(double)(0.1f)
大于0.1
,因此会占用结果。
答案 1 :(得分:2)
关键问题是0.1
无法用二进制表示完全。将其转换为基数2,您会得到一个在小数部分中带有重复的数字,1001
将永远重复(就像在十进制中一样,1/3
以{{1}结尾永远重复。)
将3
存储在浮点数中时,最终会在最后一位数*中将向上舍入,因此0.1
0.1大于{{1} } 0.1
所以,是的,将float
转换为double
只会附加(二进制)零,但float
首先已经有点过大了。
*)这实际上取决于您的实现使用的浮点数的表示。对于IEEE 754 double
s,表示将以
float
因为下一个数字是1,所以向上舍入,所以最终结果以
结束float