首页 文章

在模拟IEEE-754单精度乘法期间添加隐式位

提问于
浏览
1

我正在努力学习单精度IEEE-754乘法的工作原理 . 特别是,我正在寻找Berkley SoftFloat实施 - f32_mul .

就在执行有效数的乘法之前,将隐含位分别添加到每个乘数的有效数 . 代码的相关部分如下:

sigA = (sigA | 0x00800000)<<7;
sigB = (sigB | 0x00800000)<<8;

为什么sigB被移动8次而不是7次,类似于sigA?

1 回答

  • 2

    精心设计的转换是为了使产品适合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^23sigB >= 2^23 ,因此 sigA*sigB >= 2^46 . IOW,它至少有47位 .

    因此,通过移位15位,您可以确保结果适合63位或62位 . 你移动每个有效数字的时间并不重要,15 0或1 14同样可以正常工作 . 但是 balancer 良好的8 7,每个仍然适合32位,这是聪明的 .

    在下一行中,您会看到产品始终经过调整以适应位置63处的最高位(基于1):

    if ( sigZ < 0x40000000 ) {
            --expZ;
            sigZ <<= 1;
    }
    

    为什么不使用无符号整数运算的全64位范围?我不知道,但是你的建议是8 8班而不是7 7班 .

相关问题