C- 浮点精度

Pkp*_*Pkp 1 c floating-point precision

我有一个程序:

int main() 
{   
        float f = 0.0f;  
        int i;  

        for (i = 0 ; i < 10 ; i++) 
                f = f + 0.1f; 

        if (f == 1.0f) 
                printf("f is 1.0 \n"); 
        else 
                printf("f is NOT 1.0\n"); 

        return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

它总是打印f is NOT 1.0. 我知道这与 C 中的浮点精度有关。但我不确定它到底在哪里搞砸了。有人可以解释一下为什么不打印另一行吗?

caf*_*caf 5

二进制浮点数不能准确地表示值 0.1,因为它的二进制扩展没有有限位数(与 1/7 的十进制扩展没有完全相同的方式)。

0.1 的二元展开式是

0.000110011001100110011001100...
Run Code Online (Sandbox Code Playgroud)

当截断为 IEEE-754 单精度时,这大约0.100000001490116119是十进制。这意味着每次将“接近 0.1”的值添加到变量时,都会累积一个小错误 - 因此最终值略高于1.0.