c `digits10`为IEEE float为6,但第一个不可替代的整数已经具有8位数字



c 's std::numeric_limits<float>::digits10,在cppref上描述:

std::numeric_limits<T>::digits10的值是type t type t type t type t the type t the type t the Change of the Base-10数字的数量,也就是说,具有此许多小数位数,由于四舍五入或溢出而没有变化。

c Cousin flt_dig。

存在类似的描述。

给定的值为:

float     FLT_DIG /* 6 for IEEE float */

然而,,请在此处显示在S.O.在16,777,216(2 24 )之前,所有整数都可以在32位IEEE浮点类型中代表。如果我可以计数,该数字具有 8 数字,因此digits10的值实际上应该是 7 ,现在不应该吗?

显然,我在这里误解了有关digits10的一些事情,那么这实际上是告诉我的?


实际适用性:

我被问到是否可以将0.00 -86,400.00中的所有数字恰好存储在IEEE 32位float中。

现在,我非常有信心我们可以将0 -8,640,000中的所有数字存储在IEEE 32位float中,但是对于相同的"整数"范围而言,这是否成立于左侧?

(将此答案限制为IEEE754 float)。

8.589973e98.589974e9均映射到8589973504。这是一个断言第七重要数字的反示例。

由于在第六重要的数字上不存在这样的反例,因此std::numeric_limits<float>::digits10FLT_DIG为6。

确实可以将整数完全表示为2的24 th 2的功率。(16,777,21616,777,217均映射到16,777,216)。那是因为float具有24位 aighand

作为其他答案和评论确定,digits10涵盖了所有"指数范围",也就必须保留1234567,以及1.23456712345670000 - 仅适用于 6 数字!

7位数字的反示例:

  • 8.589,973 e98.589,974 e9(来自CPPREF示例)

有时候寻找反示例很容易。

#include <stdio.h>
#include <string.h>
int main(void) {
  int p6 = 1e6;
  int p7 = 1e7;
  for (int expo = 0; expo < 29; expo++) {
    for (int frac = p6; frac < p7; frac++) {
      char s[30];
      sprintf(s, "%d.%06de%+03d", frac / p6, frac % p6, expo);
      float f = atof(s);
      char t[30];
      sprintf(t, "%.6e", f);
      if (strcmp(s, t)) {
        printf("<%s> %.10e <%s>n", s, f, t);
        break;
      }
    }
  }
  puts("Done");
}

输出

<8.589973e+09> 8.5899735040e+09 <8.589974e+09>
<8.796103e+12> 8.7961035080e+12 <8.796104e+12>
<9.007203e+15> 9.0072024760e+15 <9.007202e+15>
<9.223377e+18> 9.2233775344e+18 <9.223378e+18>
<9.444738e+21> 9.4447374693e+21 <9.444737e+21>
<9.671414e+24> 9.6714134744e+24 <9.671413e+24>
<9.903522e+27> 9.9035214949e+27 <9.903521e+27>
<1.000000e+28> 9.9999994421e+27 <9.999999e+27>  This is an interesting one

另一个观点:

考虑每对2的幂之间, float,如ieee二进制编码2 23 线性分布的值。


示例:2 0 和2 1 或1.0和2.0,

float值之间的差异为1.0/2 23 或10.192E-06。

以文本形式编写" 1.ddddd",一个7位数字,数字的差异为1.000e-06。

因此,对于十进制文本号的每个步骤,大约有10.2 float
编码这7个数字没有问题。
在此范围内,编码8位数字也没有问题。


示例:2 23 和2 24 或8,388,608.0和16,777,216.0。

float值之间的差异为2 23 /2 23 或1.0。

以文本形式写的低端附近的数字" 8or9.dddddd*10 6 ",一个7个重要数字,具有1.0的差异。

编码这7位数字没有问题。


示例:2 33 和2 34 或8,589,934,592.0和17,179,869,184.0,

float值之间的差异为2 33 /2 23 或1,024.0。

以文本形式写的低端附近的数字" 8or9.dddddd*10 9 ",一个7个重要数字,具有1,000.0的差异。

现在我们有一个问题。从8,589,934,592.0起,然后下一个1024个文本形式的数字只有1000个不同的float编码。


7个数字d.ddddd * 10 expo 太多组合,无法使用float唯一编码。

相关内容

  • 没有找到相关文章

最新更新