比较相同的浮点数时奇怪的输出?

时间:2017-01-17 07:27:54

标签: c floating-point precision

Comparing Same Float Values In C

strange output in comparison of float with float literal

Float addition promoted to double?

我在浮点上阅读了上述链接,但是甚至得到了奇怪的输出。

location

现在,根据促销规则,不应该" ELSE IF "必须打印?

但是,这里是打印" IF "

编辑:是因为0.5 = 0.1二进制,之后一切都为0且精度损失因此没有影响,因此比较 IF 返回true。

如果它是0.1,0.2,0.3,0.4,0.6,0.7 ......,那么否则如果块返回true。

请原谅我提出同样的问题,因为我从上面的链接中读到了浮动比较绝对不能完成。

但是,这种意外行为的原因是什么?

3 个答案:

答案 0 :(得分:5)

当您阅读有关浮点类型和比较问题的链接时,您可能期望在转换期间舍入0.5,因此比较应该失败。 但是0.5是2的幂,并且可以完美地表示,而不需要浮点数或双精度变量中的任何舍入。 因此比较结果为TRUE。

编辑完问题后: 是的,如果你拿了0.1或者你提到的其他一个值,你应该碰到其他部分。

答案 1 :(得分:5)

  

浮点数永远不准确。

这种说法是错误的。一些浮点数是准确的,例如1.0,12345.0,12345.5,-2.25。所有这些数字都可以表示为以2的幂表示的整数。所有数字都不能准确。

在您的具体情况下,float x = 0.5会导致x的值为1.00000000 * 2^-1。将此值与double 0.5进行比较时,两个操作数都会转换为double,因此比较变为1.000000000000000 * 2^-1 == 1.000000000000000 * 2^-1,成功。

对于float x = 0.1,它看起来不同。该值存储为1.01010101 * 2^-3(或类似)。请注意,这已经不准确了。当您将此值与double 0.1进行比较时,浮点数在末尾以零填充,比较变为1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3,但失败。

答案 2 :(得分:-1)

第一个if语句的计算结果为true,因此会打印IF。其他表达式甚至都没有检查过。