浮点类型的有效位数

时间:2012-10-10 08:34:05

标签: c floating-point floating-point-conversion

C中类型float的说明提到有效位数为6。然而,

float f = 12345.6;

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

4 个答案:

答案 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(...)表示您是存储的实数浮点数。您无法确保浮点数中的多个有效数字。