浮点数的十进制精度

时间:2010-07-22 14:59:06

标签: floating-point

  

相当于log10(2 ^ 24)≈7.225十进制数

Wikipedia

  

精确度:7位

MSDN

  

6

std::numeric_limits<float>::digits10

为什么numeric_limits在这里返回6?维基百科和MSDN都报告浮点数的精度为7位小数。

2 个答案:

答案 0 :(得分:15)

如有疑问,请阅读规范。 C ++标准说digits10是:

  

可以无变化地表示的基数10位数。

这有点模糊;幸运的是,有一个脚注:

  

相当于FLT_DIG,DBL_DIG,LDBL_DIG

这些是在C标准中定义的;让我们在那里查看:

  

小数位数q,这样任何带有q个十进制数字的浮点数都可以舍入为p基数为b的浮点数,然后再返回,而不会更改为q个十进制数字。

所以std::numeric_limits<float>::digits10是十进制数字的数量,如果你将它转换为float并返回到十进制数,那么任意多位数的浮点数都不会改变。

正如你所说,浮点数具有大约7位小数精度,但是固定宽度小数和浮点数表示中的错误不是统一对数的。将多个形式1.xxx ..舍入到固定小数位数的相对误差几乎十倍大比舍入9.xxx ..的相对误差大到相同的数字小数位。类似地,根据值在binade中的位置,将其四舍五入为24位二进制数的相对误差可以变化近两倍。

这样做的结果是,并非所有七位小数都能在往返浮点和后退中存活,但所有六位小数都可以。因此,std::numeric_limits<float>::digits10为6。

float类型的有效范围内的指数没有那么多的六位和七位小数;如果你仍然不相信,你可以很容易地编写一个程序来详尽地测试所有这些程序。

答案 1 :(得分:2)

尾数中只有23位(有一个隐含的1,所以它实际上是24位,但1显然没有变化)。这给出了6.923689900271567精度的十进制数字,这不是7。