我正在努力学习单精度IEEE-754乘法的工作原理 . 特别是,我正在寻找Berkley SoftFloat实施 - f32_mul .
就在执行有效数的乘法之前,将隐含位分别添加到每个乘数的有效数 . 代码的相关部分如下:
sigA = (sigA | 0x00800000)<<7;
sigB = (sigB | 0x00800000)<<8;
为什么sigB被移动8次而不是7次,类似于sigA?
我正在努力学习单精度IEEE-754乘法的工作原理 . 特别是,我正在寻找Berkley SoftFloat实施 - f32_mul .
就在执行有效数的乘法之前,将隐含位分别添加到每个乘数的有效数 . 代码的相关部分如下:
sigA = (sigA | 0x00800000)<<7;
sigB = (sigB | 0x00800000)<<8;
为什么sigB被移动8次而不是7次,类似于sigA?
1 回答
精心设计的转换是为了使产品适合63位可用的带符号整数运算 .
你有24位的sigA,这意味着sigA受
sigA < 2^24
的限制 .对于sigB:
sigB < 2^24
也是如此 .因此,产品
sigA * sigB < 2^48
,或换句话说,您有一个保证,它适合48位(最多是
(2^24-1)^2=2^48-2^25+1
) .因此,如果您移位15位(8 7),则可以保证结果适合63位
由于隐含的,你还有
sigA >= 2^23
和sigB >= 2^23
,因此sigA*sigB >= 2^46
. IOW,它至少有47位 .因此,通过移位15位,您可以确保结果适合63位或62位 . 你移动每个有效数字的时间并不重要,15 0或1 14同样可以正常工作 . 但是 balancer 良好的8 7,每个仍然适合32位,这是聪明的 .
在下一行中,您会看到产品始终经过调整以适应位置63处的最高位(基于1):
为什么不使用无符号整数运算的全64位范围?我不知道,但是你的建议是8 8班而不是7 7班 .