【问题标题】:How to determine maximum positive base-10 value of a float mantissa?如何确定浮点尾数的最大正基数 10 值?
【发布时间】:2021-04-23 12:17:20
【问题描述】:

在尝试理解 int 时,如果给定 int 的大小(以位为单位),我可以使用排列公式来确定 int 的最大正数和负数 base-10 值。因此,如果一个有符号整数是 16 位宽,我可以使用 2^16 来确定可能的排列数,然后可以使用 2^15 计算正数的最大数量和负数的最大数量。

在 32 位浮点数中,24 位分配给有效数及其符号。如果我们认为符号为正,则 2^23 将是最大排列数。如何从这个数字 2^23 中获得有效数字的最大值?还是我对浮点数的理解有缺陷?

【问题讨论】:

    标签: c floating-point permutation ieee-754


    【解决方案1】:

    ieee-754 使用 significand 而不是 mantissa

    C 没有定义尾数。 C 使用 significand

    常见的float normal1 值具有 24 位有效位,由 1 个值为 1 的隐含位和 23 个显式编码的二进制小数位组成。所有 224 组合都是可能的。

    最大有效位是1.11111111 11111111 11111112 or 1.9999998807907104492187510 or (2.0-2-23) .

    当它与有限数 2(254-127) 的最大二进制指数相结合时,floatFLT_MAX 的最大值为 340282346638528859811704183484516925440.0 或大约 3.402823466e+38。


    1对于子数字,没有隐含的位。

    最大有效数是0.11111111 11111111 11111112或0.9999998807907104492187510

    【讨论】:

    • 根据您的建议,我已将问题中的“尾数”更改为“有效位”
    【解决方案2】:

    float 的正常有效数字的可能值的数量是(FLT_RADIX-1)/FLT_EPSILON,其中FLT_RADIXFLT_EPSILON 是通过包含<float.h> 来定义的。

    这是因为FLT_EPSILON 是从 1 到下一个更大的可表示数字的步长,所以它是有效位中 1 的变化(当它们被解释为二进制整数并且我们从浮点数开始时)点编号 1.000…000)。 FLT_RADIX/FLT_EPSILON 计算有效数字可以通过多少步,从 0 开始,直到它换行或溢出其前导数字。但是,我们不是从零开始;而是从零开始。问题要求不包括隐式前导 1 位。基于二进制的归一化浮点数的前导位是 1,但是,当我们推广到其他基数时,浮点数的前导位可能不是 1 的归一化数;它可以是小于FLT_RADIX 的非零整数。因此,从 1 而不是 0 开始,有(FLT_RADIX-1)/FLT_EPSILON 可能的正常有效位值。

    请注意,(FLT_RADIX-1)/FLT_EPSILON 具有整数值但浮点类型。要将其用作整数类型,您可能需要进行强制转换,例如使用 %d 打印时。

    与 1 具有相同小数位数(指数)但最大有效位为 FLT_RADIX - FLT_EPSILON 的浮点数。作为整数的有效数字的最大值是FLT_RADIX/FLT_EPSILON - 1。请注意,后者包括前导数字。

    注意事项

    “有效位”是浮点数小数部分的首选术语。 “尾数”是对数的小数部分的旧术语。有效数字是线性的;乘以有效数乘以表示的数字。尾数是对数;添加到尾数会乘以表示的数字。

    “排列”是指移动事物; (1 2 3 4) 和 (3 4 2 1) 是彼此的排列。您似乎想要有效位可以具有的不同值的数量。

    【讨论】:

    • 你说得对,我确实指的是有效位可以具有的不同值的数量,但是我希望了解是否可以确定浮点数的最大和最小基数为 10可以包含该排列数,即 2^23,因为可以根据位数可以容纳的值来确定基于 int 和 int 的类型的最大和最小 base-10 值。
    • @Monke:你想要float 可以表示的最大有限值,而不仅仅是它的有效值可以具有的最大值吗?该值是FLT_RADIX-FLT_EPSILON 乘以FLT_RADIXFLT_MAX_EXP-1 的幂。 (-1 是由于 C 标准对有效位的处理有点不寻常。)C 标准库有一个函数“x 乘以FLT_RADIX n 的幂”;是scalbnf(x, n),所以float可以表示的最大有限值为scalbnf(FLT_RADIX-FLT_EPSILON, FLT_MAX_EXP-1)<float.h> 用这个值定义了一个宏,FLT_MAX
    【解决方案3】:

    不考虑指数,尾数的大小没有意义。 23 告诉你的是有效小数位数是23 * log(2) ≈ 7。

    然而,第 24 位是隐含的,给出的 24 * log(2) > 7。因此所有 7 位整数值都可以存储而不会损失精度。

    此外,任何以 2 的幂为因数的整数,除以该因数后的位数不超过 7 位,也可以精确表示,因为 2 的幂被指数占用(受指数值的限制)。

    因此,指数大小给出了可以存储的值的范围,而尾数(有效数)大小给出了精度

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-11
      • 2020-12-20
      • 2017-02-08
      • 2011-10-27
      • 2011-01-18
      • 2013-02-20
      • 1970-01-01
      • 2014-10-23
      相关资源
      最近更新 更多