这个输出背后的原因是什么?

时间:2014-11-29 12:55:06

标签: c

这是代码。

#include<stdio.h>
int main()
{
    float i=4.05;
    if(i==4.05)
    printf("Condition True");
    else
    printf("Condition False");
    return 0;
}

此代码显示错误输出。我不知道为什么条件为真,而不是输出为假的原因。

但是这段代码显示了正确的输出。

 #include<stdio.h>
 int main()
 { 
     float i=4.5;
     if(i==4.5)
     printf("Condition True");
     else
     printf("Condition False");
     return 0;
 }

1 个答案:

答案 0 :(得分:4)

4.54.05double文字。您将它们分配给float,这需要可能有损转换(舍入),然后再将它们与同一文字进行比较,从而将float提升为double。第二次转换始终是精确的,但它无法撤消在第一次双重&gt;浮点转换期间发生的舍入错误。

(double)(float)4.5等于4.5,因为二进制浮点的内部表示:4.5 = 9/2 = 9 * 2 -1 。这完全由float和double表示。

(double)(float)4.05不等于4.05,因为4.05无法在基数2(具有有限位数)中精确表示:它是405/10 = 405 * 2 -1 * 5 -1 。 5 -1 因子在基数2中是周期性的。因此当将4.05表示为float或double时,它会舍入到相应类型可以容纳的位数(浮点数为24位,双精度值为53) ,这当然导致不同的数字(尝试将2/3四舍五入到四位二位数和六位小数)。