为什么我的浮动除以0.00390625?

pee*_*ush 1 c

float a=67107842,b=512;
float c=a/b;
printf("%lf\n",c);
Run Code Online (Sandbox Code Playgroud)

为什么c131070.000000而不是正确值131070.00390625?

Mat*_*ery 9

您的编译器float类型可能使用32位IEEE 754单精度格式.

67107842是一个26位二进制数:

  11111111111111110000000010
Run Code Online (Sandbox Code Playgroud)

单精度格式表示大多数数字1.x乘以2的一些(正或负)幂,其中23位存储在二进制位置之后,1.隐含前导(非常小的数字是例外).

但是67107842在二进制位置后需要24位(表示为1.111111111111111000000001乘以2 25).由于只有存储23位的空间,最终1会丢失.所以a在这种情况下,它的值是错误的,而不是除法 - a实际上包含67107840(11111111111111110000000000),正好是131070*512.

如果你打印也可以看到这个a:

printf("%lf %lf %lf\n", a, b, c);
Run Code Online (Sandbox Code Playgroud)

67107840.000000 512.000000 131070.000000
Run Code Online (Sandbox Code Playgroud)


Eri*_* Pi 7

尝试将a和c更改为"double"类型,而不是float.这将为您提供更好的精度/准确度.(浮动有大约6个左右的有效数字;双倍数量超过两倍.)