Skip to content

半精度浮点数(也称为16位浮点数)转换的步骤

半精度浮点数(也称为16位浮点数)转换的步骤:

  1. 符号位 (Sign bit): 由于我们的数字是负数,所以符号位为1。

  2. 指数 (Exponent): 半精度浮点数的偏移量为15。我们的数字是10,所以我们只需使用整数部分来表示。这意味着我们使用了 \(2^3 = 8\) 作为基数,而实际的指数为3。但由于偏移量是15,所以我们需要添加这个偏移量,得到 \(3 + 15 = 18\)。

    将18转换为二进制,得到 10010。但是指数位有5位,所以是 10010

  3. 尾数 (Mantissa/Fraction): 为了得到尾数,我们需要将10除以上面得到的基数8,即 10 ÷ 8 = 1.25。整数部分是1(我们已经考虑过这部分,所以在尾数中我们不再表示它),剩下的是小数部分,即0.25。

    为了表示0.25,我们可以这样想:0.25是2的哪个负次幂?答案是 \(2^{-2}\)。所以,我们的尾数中的第二位是1,其余为0。

    由于尾数有10位,所以它是 0100000000

  4. 组合所有位: 符号位为1,指数为 10010,尾数为 0100000000。组合起来,我们得到 1100101000000000

  5. 转换为十六进制: 将上面的二进制字符串转换为十六进制,我们得到 C900

这就是如何得到负10的半精度浮点数表示的过程。


将一个整数转化为浮点数并将其表示为2字节的浮点数(也被称为半精度或float16)是有些复杂的。IEEE 754标准定义了半精度浮点数的表示方式,

以下是10的半精度浮点数的手动计算:

  1. 符号位 (S): 0 (因为10是正数)
  2. 指数 (E): 5位
  3. 尾数 (F): 10位 10的二进制表示为 `1010`,我们可以将其标准化为 `1.01 x 2^3`。

为了找到E和F,我们需要对指数进行偏置。对于半精度浮点数,偏置值为15,因此实际指数为3 + 15 = 18。这表示为二进制 10010

尾数部分为 010 0000 0000

因此,整个半精度浮点数为 0 10010 0100000000,或者为十六进制 4A00


接下来计算负20和负30的2字节浮点数表示。

首先,我们来处理 负20

  1. 符号位 (Sign bit): 由于数字是负数,所以符号位为1。

  2. 指数 (Exponent): 我们将20表示为 \(2^4 = 16\) 的形式,所以实际的指数为4。加上偏移量15,得到19,即二进制的 `10011`。

  3. 尾数 (Mantissa/Fraction): 为了得到尾数,我们需要将20除以上面得到的基数16,得到 \(20 ÷ 16 = 1.25\)。整数部分是1(我们已经考虑过这部分,所以在尾数中我们不再表示它),剩下的是小数部分,即0.25。 小数部分0.25是 \(2^{-2}\)。所以,我们的尾数中的第二位是1,其余为0。

    尾数为 0100000000

  4. 组合所有位: 符号位为1,指数为 10011,尾数为 0100000000。组合起来,我们得到 1100110100000000

  5. 转换为十六进制: 上面的二进制串转换为十六进制是 CD00

现在,我们处理 负30

  1. 符号位 (Sign bit): 符号位为1,因为数字是负数。

  2. 指数 (Exponent): 我们将30表示为 \(2^4 = 16\) 和 \(2^5 = 32\) 之间,所以实际的指数为4。加上偏移量15,得到19,即二进制的 `10011`。

  3. 尾数 (Mantissa/Fraction): 为了得到尾数,我们需要将30除以16,得到 \(30 ÷ 16 = 1.875\)。整数部分是1,剩下的小数部分是0.875。 0.875可以表示为 \(2^{-1} + 2^{-2} + 2^{-3}\)。所以,尾数中的前三位是1,其余为0。

    尾数为 1110000000

  4. 组合所有位: 符号位为1,指数为 10011,尾数为 1110000000。组合起来,我们得到 1100111100000000

  5. 转换为十六进制: 上面的二进制串转换为十六进制是 CF00

综上所述:

  • 负20的2字节浮点数表示为 CD00
  • 负30的2字节浮点数表示为 CF00