浮点数的十进制精度

lio*_*ori 12 floating-point

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

维基百科

精度:7位数

MSDN

6

std::numeric_limits<float>::digits10
Run Code Online (Sandbox Code Playgroud)

为什么numeric_limits在这里返回6?维基百科和MSDN都报告浮点数具有7个十进制数字的精度.

Ste*_*non 15

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

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

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

相当于FLT_DIG,DBL_DIG,LDBL_DIG

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

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

std::numeric_limits<float>::digits10如果您将其转换为a float并返回到十进制,则具有该多位数的任何浮点数都将保持不变,因此是十进制数字的数量.

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

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

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

  • 0.3 转换为浮点数(假设此处为 IEEE-754 单精度)正好是 `0.300000011920928955078125`。当该值四舍五入到六位小数时,结果为 0.3,因此当浮点并返回六位小数时,结果保持不变。对于“float”可表示范围内的所有六位小数都是如此。 (2认同)