#include <stdio.h>
int main() {
float k;
scanf("%f", &k);
printf("%f", k);
}
在这个简单的程序中,当我输入一个最多包含8位数的数字时,它会正确显示。
但如果我超过8位数,即输入123456789
,则输出为123456792
。
为什么会这样?好有趣的事实是,如果我在123456789
和123456796
之间输入任意数字,那么它始终会显示123456792
。
它是否与浮点数的8位小数精度相关?
答案 0 :(得分:5)
浮点类型的精度有限。对于您机器上的raw_input()
,它看起来是32位,它具有24位精度(显式存储23个,隐含1个)。这意味着大于~16000000的整数(需要超过24位存储)无法用这种数据类型精确表示。
例如,您使用的值123456789具有二进制表示形式:
float
该值占用27位,超过可用值。所以它四舍五入到可以用23位存储的最接近的值,即123456792.在二进制:
111 0101 1011 1100 1101 0001 0101
对于此值,未显式存储值为0的低3位。