【问题标题】:Calculating floating points as binary将浮点数计算为二进制
【发布时间】:2015-05-26 14:21:14
【问题描述】:
问题是:
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 格式显示它。提前感谢您的帮助。
【问题讨论】:
标签:
double
bit-manipulation
point
floating
【解决方案1】:
我同意应该以二进制而不是通过转换为十进制和十进制乘法来完成的评论。我使用Exploring Binary 进行算术运算。
第一步是找到实际的二进制有效数字。两个输入都不正常,因此它们是 1.000101 和 1.00100001。
将它们相乘,得到 1.00110111100101。
同样,从指数中减去偏差,二进制 1111111,得到 10 和 11。将它们相加,得到 101,然后加回偏差,10000100。
符号位不同的两个数相乘的符号位为 1。
现在把它们打包回去。有效数出现在 [1,2) 范围内,因此无需标准化和调整指数。我们仍在正常范围内,因此将有效数字中二进制点之前的 1 去掉。有效数字足够窄,无需四舍五入即可容纳 - 只需添加足够的尾随零。
1 10000100 00110111100101000000000
【解决方案2】:
您通过转换为十进制使其变得更加困难,就像您必须将其转换回来一样。不是不能那样做,而是手工更难。
在不进行转换的情况下,将两个浮点数相乘的算法(大致)是这样的:
- 把隐含的 1 放回去(如果适用)
- 乘以全尺寸(不要截断)(如果您知道它们的工作原理,您可以只使用 Guard 和 Sticky)
- 添加指数
- 异或符号
- 规范化/舍入/处理特殊情况(下溢/溢出)
所以在这里,乘法(如果你忘记了,看看二进制乘法是如何工作的)
1.00010100000000000000000 *
1.00100001000000000000000 =
1.00100001000000000000000 +
0.000100100001000000000000000 +
0.00000100100001000000000000000 =
1.00110111100101000000000000000
添加指数(注意偏差),在本例中为 2+3 = 5,因此 132 = 10000100。
异或符号,得到 1。
不需要舍入,因为无论如何丢弃的位都是零。
结果:1 10000100 00110111100101000000000