相当于log10(2 ^ 24)≈7.225十进制数
精确度:7位
6
std::numeric_limits<float>::digits10
为什么numeric_limits在这里返回6?维基百科和MSDN都报告浮点数的精度为7位小数。
答案 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。