浮点类型的有效位数

mk_*_*mk_ 9 c floating-point floating-point-conversion

floatC中的类型描述提到有效位数是6.然而,

float f = 12345.6;
Run Code Online (Sandbox Code Playgroud)

然后使用printf()打印12345.6它不打印,它打印12345.599609.那么double对于浮点类型来说,"6位有效数字"(或者"a "表示"15 ")是什么意思?

Cra*_*sta 16

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


Mih*_*eac 11

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

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


cdh*_*wie 8

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

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