对于IEEE float,C++`digits10`是6,但是第一个不可表示的整数已经有8位数?

Mar*_* Ba 3 c c++ floating-point significant-digits

C++中的c ++ std::numeric_limits<float>::digits10描述如下:

std::numeric_limits<T>::digits10是可以由类型T表示的基数为10的数字而没有变化,也就是说,具有这么多十进制数字的任何数字都可以转换为类型T的值并返回到十进制形式,而没有更改到期四舍五入或溢出.

C表兄弟FLT_DIG存在类似的描述.

给出的值是:

float     FLT_DIG /* 6 for IEEE float */
Run Code Online (Sandbox Code Playgroud)

但是,这里显示的是,所有高达16,777,216(2 24)的整数都可以在32位IEEE浮点类型中精确表示.如果我可以计算,那个数字有8个数字,所以digits10实际上应该是7的值,现在应该不是吗?

很显然,我误解了digits10这里的一些事情,那么这实际上告诉了我什么呢?


实用性:

我被问到是否可以存储所有数字0.00- 86,400.00完全在IEEE 32位浮点数中.

现在,我非常有信心我们可以存储所有数字0- 8,640,000在IEEE 32位浮点数中,但这是否适用于向左移动2位数的相同"整数"范围?

Bat*_*eba 9

(限制IEEE754的答案float).

8.589973e9并且8.589974e9都映射到8589973504.这是第7个有效数字被保留的断言的反例.

由于在第6位有效数字上没有这样的反例,std::numeric_limits<float>::digits10并且FLT_DIG是6.

实际上,整数可以精确地表示为2的24 幂(16,777,216并且16,777,217都映射到16,777,216).那是因为a float有24位有效数.