Berkeley softfloat 中除法和开根号操作的具体实现思路?

新手上路,请多包涵

最近在看Berkeley softfloat 中除法和开根号部分,最后的舍入的实现思路有点难懂,大神们有了解这方面的吗?

recip32 = softfloat_approxRecip32_1( sigB>>32 ) - 2; //differs from the true reciprocal by at most 2.006 ulp(units in the last place).
sig32Z = ((uint32_t) (sigA>>32) * (uint_fast64_t) recip32)>>32;
doubleTerm = sig32Z<<1;
rem =
    ((sigA - (uint_fast64_t) doubleTerm * (uint32_t) (sigB>>32))<<28)
        - (uint_fast64_t) doubleTerm * ((uint32_t) sigB>>4);
q = (((uint32_t) (rem>>32) * (uint_fast64_t) recip32)>>32) + 4;
sigZ = ((uint_fast64_t) sig32Z<<32) + ((uint_fast64_t) q<<4);
/*------------------------------------------------------------------------
*------------------------------------------------------------------------*/
if ( (sigZ & 0x1FF) < 4<<4 ) {
    q &= ~7;
    sigZ &= ~(uint_fast64_t) 0x7F;
    doubleTerm = q<<1;
    rem =
        ((rem - (uint_fast64_t) doubleTerm * (uint32_t) (sigB>>32))<<28)
            - (uint_fast64_t) doubleTerm * ((uint32_t) sigB>>4);
    if ( rem & UINT64_C( 0x8000000000000000 ) ) {
        sigZ -= 1<<7;
    } else {
        if ( rem ) sigZ |= 1;
    }
}
阅读 1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进