大于C中浮点数的比较

时间:2017-11-23 17:11:21

标签: c

请考虑以下代码:

float x = 0.1;
if ( x> 0.1){
    printf("if");
}

现在,当我检查相等性时,解释了x通过在末尾填充0来转换为double,但是RHS上的0.1存储为double,因此不等式。 但是,如果我遵循这个逻辑,那么" if"在上面的代码中应该给出错误,但事实确实如此。 为什么呢?

2 个答案:

答案 0 :(得分:7)

(限制对IEEE754的回答虽然C支持的所有浮点方案都要求double集是float集的超集。)

0.10.1000000000000000055511151231257827021181583404541015625

0.1f0.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