将浮点数计算为二进制

Calculating floating points as binary

问题是: x 和 y 是两个 32 位 IEEE 浮点格式的浮点数 (8 位指数,偏置 127)其二进制表示如下:

x: 1 10000001 00010100000000000000000

y: 0 10000010 00100001000000000000000

计算它们的乘积 z = x y 并以二进制 IEEE 浮点格式给出结果。

所以我发现 X = -4.3125。 y = 9.03125。我可以将它们相乘并得到 -38.947265625。我不知道如何以 IEEE 格式显示它。在此先感谢您的帮助。

您通过转换为十进制使其变得更加困难,而您必须将其转换回来。不是不能那样做,而是手工比较难。

不进行转换,两个浮点数相乘的算法(大致)是这样的:

  • 放回隐含的 1(如果适用)
  • 乘以全尺寸(不要截断)(如果你知道它们的工作原理,你可以只使用 Guard 和 Sticky)
  • 加上指数
  • xor 符号
  • normalize/round/handle 特殊情况 (under-/overflow)

所以在这里,乘法(如果你忘记了,看看二进制乘法是如何工作的)

1.00010100000000000000000 *
1.00100001000000000000000 =

1.00100001000000000000000       +
0.000100100001000000000000000   +
0.00000100100001000000000000000 =

1.00110111100101000000000000000

添加指数(注意偏差),在本例中为 2+3 = 5,因此 132 = 10000100。

符号异或,得到1。

不需要四舍五入,因为丢弃的位无论如何都是零。

结果:1 10000100 00110111100101000000000

我同意应该用二进制来完成的评论,而不是转换为十进制和十进制乘法。我用 Exploring Binary 做算术。

第一步是找到实际的二进制有效数字。两个输入都不是正规的,所以它们是 1.000101 和 1.00100001。

将它们相乘,得到 1.00110111100101。

类似地,从指数中减去二进制 1111111 的偏差,得到 10 和 11。将它们相加,得到 101,然后加回偏差 10000100。

符号位不同的两个数相乘的符号位为1

现在把它们全部打包回去。 signficand 出现在 [1,2) 范围内,因此无需标准化和调整指数。我们仍然在正常范围内,所以在有效数字的二进制小数点之前去掉 1。尾数足够窄,无需舍入 - 只需添加足够多的尾随零即可。

1 10000100 00110111100101000000000