浮点类型的有效位数

C中类型float的描述提到有效位数是6 。 然而,

 float f = 12345.6; 

然后使用printf()打印它不打印12345.6 ,它打印12345.599609 。 那么对于浮点类型,“6位有效数字”(或“ double情况下为15”)意味着什么呢?

根据标准 ,并非所有十进制数都可以精确地存储在内存中。 根据表示的大小,错误可以达到某个最大值。 对于float这是0.0001% (6位有效数字= 10^-6 = 10^-4 % )。

在您的情况下,错误是(12345.6 - 12345.599609) / 12345.6 = 3.16e-08远低于浮动的最大错误。

6位有效数字表示最大误差约为+/- 0.0001%。 单个浮点值实际上具有大约7.2位精度( 源 )。 这意味着误差约为+/- 12345.6 / 10 ^ 7 = 0.00123456。 这是你的错误的顺序(0.000391)。

您所看到的并不是有效数字的任何问题,而是计算机上的数字以二进制forms存储的事实,并且3/5(= 0.6)没有有限的二进制表示。 二进制的3/5看起来像0.100110011001 …,“1001”模式永远重复。 该序列相当于0.599999 …重复。 在与精度相关的任何错误发生之前,您实际上到了小数点右侧的三个小数位。

这类似于没有有限的基数-10表示1/3; 我们有0.3333永远重复。

这里的问题是你不能保证一个数字可以存储在一个浮点数中。 您需要用IEEE 754解释的尾数,基数和指数来表示这个数字。 printf(...)表示您是存储的实数浮点数。 您无法确保浮点数中的多个有效数字。