【问题标题】:What is the maximum value of the exponent of single precision floating point on MSVC?MSVC上单精度浮点指数的最大值是多少?
【发布时间】:2020-11-10 21:11:02
【问题描述】:

我一直试图弄清楚有偏指数是如何工作的。 8 位为指数 itef 保留,所以它是 -127 到 127 或 0 到 255。当我想存储一个不适合 8 位的数字(指数部分)时,它会获得额外的位来存储该数据从? 如果您要说它使用偏差作为偏移量,请提供有关数据存储位置的附加信息。

【问题讨论】:

  • 如果您试图将一个大于FLT_MAX2^128,大约为3.402823e+38)的数字存储在float 变量中,则会发生溢出并且变量的值变为正无穷大。
  • 为什么你认为指数不适合八位的数字可以存储在单精度浮点对象中?用于有限数的最大指数代码为 254。去除 127 偏差后,此代码表示 2^127 的指数。值为 2^128 及更大的有限数不能以单精度格式表示。因为没有存储数据,所以没有获得额外的位来存储数据。
  • @Eric Postpischil,我仍然很困惑。 32 位单精度。 1 位用于符号,8 位用于指数,其余用于尾数。如您所说,世博会的最大数量是254。当我存储数字30020.3f时怎么可能?在 msvc 中一切似乎都运行良好。 30k 如何适合 8 位? 30020 代表指数,0.3 代表分数。
  • @EricPostpischil “-14”?乘以 2^14。
  • 首先,30020.3 被转换为它可以用格式表示的最接近的值,1.8322937488555908203125•2^14,等于 30020.30078125。 1.8322937488555908203125 是有效数字。在二进制中,它是 1.11010101000100010011100。小数点后的 23 位 11010101000100010011100 存储在编码的有效位字段中。指数 14 通过加 127 进行编码,产生 141,并存储在指数字段的 8 位中。

标签: visual-c++ types floating-point double precision


【解决方案1】:

对于第一个近似值,指数为e 和有效数字为f 的浮点值是1.f x 2^e。关于次正规、无穷大、NaN 等,有一些特殊情况需要考虑;但是对于初学者,您可以忽略这些。本质上,指数实际上是 IEEE754 表示法中 base-2 的指数。因此,您对30020.3f 如何适合 8 位的评论很简单:很容易。您只需要14 的指数来表示它,这可以很好地用 8 位的偏置指数来表示;能够很好地覆盖它。

事实上,这是30020.3 的精确二进制二进制表示为单精度 IEEE-754 浮点数:

                  3  2          1         0
                  1 09876543 21098765432109876543210
                  S ---E8--- ----------F23----------
          Binary: 0 10001101 11010101000100010011010
             Hex: 46EA 889A
       Precision: SP
            Sign: Positive
        Exponent: 14 (Stored: 141, Bias: 127)
       Hex-float: +0x1.d51134p14
           Value: +30020.3 (NORMAL)

如您所见,我们只是将14 存储在指数中。符号为0,分数覆盖其余部分,因此1.f * 2^14 为您提供正确的值。

【讨论】:

    【解决方案2】:

    MSVC上单精度浮点指数的最大值是多少?

    二进制指数的最大值:254-BIAS --> 127

    从十进制的角度来看,<float.h>FLT_MAX_10_EXP 是“10 次幂在可表示的有限浮点数范围内的最大整数”38

    printf("%d %g\n", FLT_MAX_10_EXP, FLT_MAX);
    // common result
    38 3.40282e+38
    

    8 位为指数本身保留,因此它是 -127 到 127 或 0 到 255。

    非常接近:对于有限值,原始指数更像 [0...254] 值 0 具有特殊含义:好像 原始指数 为 1 和 0. 暗示数字。

    指数然后是原始指数 - 127或[-126到127]的偏差。

    回想一下,这是 2 的幂次幂。


    使用binary32,有限值的有偏指数的最大值是254。

    应用-127的偏差,指数最大值为254-127或127,形式为:

    biased_exponent > 0
    -1neg_sign * 1.(23 位有效小数)* 2biased_exponent - 127


    对于次正规和零的完整:

    biased_exponent == 0
    -1neg_sign * 0.(23 位有效小数)* 21 - 127


    How 30k fits into 8 bits? 30020 is for exponent and .3 for fraction.

    数学上 30020.3f 有一个 30020 整数部分和一个分数。 30030 不适用于 指数,而 .3 不适用于其他地方使用的分数。所有值都有助于指数和有效数floats 通常被编码为二进制 1.xxxxx2 * 2exponent

    printf("%a\n", 30020.3f); // 0x1.d51134p+14
    

    +1.110101010001000100110102 * 214

    使用binary32编码

    符号+或0,
    有偏指数(14 + 127 = 141 或 100010112
    有效数字11010101000100010011010的分数

    0 10001011 110101010001000100110102
    01000101 11101010 10001000 100110102
    45 EA 88 9A16

    【讨论】:

    • 我在想整数必须适合 8 位 expo 和小数部分到尾数位。很难理解解释。你能再把它简化成英文吗?意义是……?我猜对了,分数之前的数字无关紧要,它将被编码为 23 位(如果是 33 位浮点数)?
    • @Richard 30020.3 就像 3.00203 * 10^4。以 10 为底,3.00203 是 有效位,4 是 指数。在基数 2 中,1.11010101000100010011010 是 有效位,而 0b1110 或 14(十进制)是 指数。当编码为float 时,有效数字的小数部分与有偏差的指数一起存储。
    猜你喜欢
    • 2021-11-06
    • 2011-05-17
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2011-03-29
    • 2014-10-07
    相关资源
    最近更新 更多