将浮点计算为二进制

时间:2015-05-26 14:21:15

标签: double bit-manipulation point floating

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

x:1 10000001 000101000000000000000000

y:0 10000010 00100001000000000000000

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

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

2 个答案:

答案 0 :(得分:1)

通过转换为十进制,你必须将它转换回来的方式变得更难了。并不是说不能这样做,而是手工操作更难。

没有转换,将两个浮点数相乘的算法是(大致)这个:

  • 隐含1回(如适用)
  • 乘以全尺寸(不要截断)(如果你知道它们是如何工作的话,你可以使用Guard和Sticky来逃脱)
  • 添加指数
  • xor the signs
  • 规范化/舍入/处理特殊情况(欠/溢)

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

1.00010100000000000000000 *
1.00100001000000000000000 =

1.00100001000000000000000       +
0.000100100001000000000000000   +
0.00000100100001000000000000000 =

1.00110111100101000000000000000

添加指数(记住偏见),在这种情况下2 + 3 = 5,所以132 = 10000100。

Xor的迹象,得到1。

不需要舍入,因为丢弃的位总是为零。

结果:1 10000100 00110111100101000000000

答案 1 :(得分:1)

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

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

将它们相乘,得到1.00110111100101。

同样地,从指数中减去偏差二进制1111111,得到10和11.加上那些,得到101,然后加回偏差,10000100。

用于将两个数字乘以不同符号位的符号位将为1.

现在将它们全部打包在一起。 signficand出现在[1,2]范围内,因此无需标准化和调整指数。我们仍处于正常范围内,因此在有效数字中的二进制点之前删除1。有效位数足够窄,无需舍入 - 只需添加足够的尾随零。

1 10000100 00110111100101000000000