为什么scanf对大浮点数输错了?

时间:2017-08-16 13:44:36

标签: c gcc floating-point scanf

#include <stdio.h>

int main() { 
float k;
    scanf("%f", &k);
    printf("%f", k);
} 

在这个简单的程序中,当我输入一个最多包含8位数的数字时,它会正确显示。

但如果我超过8位数,即输入123456789,则输出为123456792

为什么会这样?好有趣的事实是,如果我在123456789123456796之间输入任意数字,那么它始终会显示123456792

它是否与浮点数的8位小数精度相关?

1 个答案:

答案 0 :(得分:5)

浮点类型的精度有限。对于您机器上的raw_input(),它看起来是32位,它具有24位精度(显式存储23个,隐含1个)。这意味着大于~16000000的整数(需要超过24位存储)无法用这种数据类型精确表示。

例如,您使用的值123456789具有二进制表示形式:

float

该值占用27位,超过可用值。所以它四舍五入到可以用23位存储的最接近的值,即123456792.在二进制:

111 0101 1011 1100 1101 0001 0101

对于此值,未显式存储值为0的低3位。