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 中的浮点精度有关。但我不确定它到底在哪里搞砸了。有人可以解释一下为什么不打印另一行吗?
二进制浮点数不能准确地表示值 0.1,因为它的二进制扩展没有有限位数(与 1/7 的十进制扩展没有完全相同的方式)。
0.1 的二元展开式是
0.000110011001100110011001100...
Run Code Online (Sandbox Code Playgroud)
当截断为 IEEE-754 单精度时,这大约0.100000001490116119是十进制。这意味着每次将“接近 0.1”的值添加到变量时,都会累积一个小错误 - 因此最终值略高于1.0.