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