C中类型float
的说明提到有效位数为6
。然而,
float f = 12345.6;
然后使用printf()打印它不会打印12345.6
,它会打印12345.599609
。那么“6位有效数字”(或“double
”中的“15”)对浮点类型意味着什么?
答案 0 :(得分:16)
6位有效数字表示最大误差约为+/- 0.0001%。单个浮点值实际上具有大约7.2位精度(source)。这意味着误差约为+/- 12345.6 / 10 ^ 7 = 0.00123456。这是你的错误的顺序(0.000391)。
答案 1 :(得分:11)
根据standard,并非所有十进制数都可以精确地存储在内存中。根据表示的大小,错误可以达到某个最大值。对于float
,这是0.0001%
(6位有效数字= 10^-6
= 10^-4 %
)。
在您的情况下,错误(12345.6 - 12345.599609) / 12345.6 = 3.16e-08
远远低于浮动的最大错误。
答案 2 :(得分:8)
你所看到的并不是有效数字的任何问题,而是计算机上的数字以二进制形式存储的事实,并且没有3/5(= 0.6)的有限二进制表示。二进制3/5看起来像0.100110011001 ...,“1001”模式永远重复。这个序列相当于0.599999 ......重复。在与精度相关的任何错误发生之前,你实际上已经到达小数点右边的三个小数位。
这类似于没有1/3的有限基数-10表示;我们有0.3333永远重复。
答案 3 :(得分:0)
这里的问题是你无法保证数字可以存储在浮点数中。你需要用尾数,基数和指数来表示这个数字IEEE 754。数字printf(...)
表示您是存储的实数浮点数。您无法确保浮点数中的多个有效数字。