2017-08-16 250 views
0
#include <stdio.h> 

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

在这个简单的程序中,当我输入一个最多包含8位数字的数字时,它会正确显示。为什么scanf为大浮点数输入错误的输入?

但是,如果我超过了8位,即对于输入123456789输出是123456792

为什么会发生这种情况?那么有趣的是,如果我在123456789123456796之间输入任何数字,那么它总是会显示123456792

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

+1

https://stackoverflow.com/questions/12560291/set-back-default-precision-c –

+4

@HariomSingh链接的问题是如何相关的?甚至没有相同的语言。 – Toby

+0

@Toby问题最初是用[tag:C++]进行双重标记的,将其删除,因为代码和文本都没有引用C++。 –

回答

5

浮点类型的精度有限。对于机器上的float,它似乎是32位,它具有24位精度(23个明确存储,1个隐含位)。这意味着大于〜16000000的整数,需要超过24位来存储,不能完全用这个数据类型表示。

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

111 0101 1011 1100 1101 0001 0101 

此值占用27位,它们是大于可用。因此,它被四舍五入为可存储与23位,这是123456792.在二进制最接近的值:

111 0101 1011 1100 1101 0001 1000 

对于这个值,具有0值的下3位未明确存储。

+0

关闭1:约16000000正好,但典型的“浮点”有24位精度。 23个是直接编码的,1个是隐含的。首先将一个整数转换为“float”,这是16,777,217(0x1000001),一个25位整数。 – chux

+1

@chux好的。更新以反映。 – dbush