代码之家  ›  专栏  ›  技术社区  ›  liori

浮点小数精度

  •  12
  • liori  · 技术社区  · 14 年前

    相当于log10(2^24)__7.225十进制数字

    Wikipedia

    精度:7位

    MSDN

    std::numeric_limits<float>::digits10
    

    为什么numeric_limits在这里返回6?wikipedia和msdn的浮动报告都有7位小数的精度。

    2 回复  |  直到 14 年前
        1
  •  15
  •   Stephen Canon    14 年前

    如果有疑问,请阅读规范。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的相对误差大。到相同的小数位数。类似地,根据一个值落在二进制代码中的位置,将其四舍五入到24个二进制数字的相对误差可以变化近两倍。

    结果是,不是所有的七位小数都能在来回浮动的过程中存活下来,但所有的六位小数都能存活下来。因此, std::数值_限制<float>::数字10 是6。

    对于 浮动 输入;如果您仍然不确信,您可以很容易地编写一个程序来彻底测试所有这些内容。

        2
  •  2
  •   Paul R    14 年前

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