非恢复有符号整数除法后校正

Posted

技术标签:

【中文标题】非恢复有符号整数除法后校正【英文标题】:Non-restoring signed integer division post-corrections 【发布时间】:2012-04-22 23:10:28 【问题描述】:

我无法弄清楚非恢复整数除法的后更正。出于某种原因,我不断收到一些不需要更正或在需要时不更正的情况

这里是算法的伪代码。 Dividend 是 16 位,其他是 8 位。 Dividend_SignRemainder_Sign 我的意思是它们的 MSB 是 1,所以它们是 2 的补码的负数。

LoopCounter = 8;
do 
    Shift Dividend Left with 0 in LSB;

    if (Dividend_Sign XOR Divisor_Sign) 
        Shift 0 into Quotient;
        DividendHighByte = DividendHighByte + Divisor;
     else 
        shift 1 into Quotient;
        DividendHighByte = DividendHighByte - Divisor;  // subtraction by 2's complement
    
 while (loopCounter != 0);

Remainder = DividendHighByte;

// here i do the Quotient conversion
invert MSB;  // shifted out anyway. Probably should be used for overflow check, not important atm.
shift 1 into Quotient;

现在我基本上有了正确的答案,它只需要以一种或另一种方式进行后校正......或者根本不进行后校正。我不确定所有更正案例是什么。现在我有一半的时间不能工作,但无论如何都在这里:

if (Dividend_Sign XOR Remainder_sign)      // diff signs so correct
    if (Remainder_Sign XOR Divisor_Sign)   // diff signs just add
        Remainder = Remainder + Divisor;
        Quotient = Quotient - 1;
     else 
        Remainder = Remainder - Divisor;
        Quotient = Quotient + 1;
    

http://en.wikipedia.org/wiki/Division_%28digital%29

http://www.acsel-lab.com/arithmetic/papers/ARITH17/ARITH17_Takagi.pdf

【问题讨论】:

您能否详细说明,或者至少列举一下不起作用的情况? atm found -10:2 和 -10:-2 是正确的预校正,校正会搞砸。 -16:4 需要更正,但不需要。我认为这与他们的余数为 0 有关。 请说明修正完成后剩余部分的要求(暂时忽略修正是如何完成的)。 嗯,我需要它是余数的正确二进制表示。不知道你的要求是什么意思是正确的 - 商 * 除数 + 余数 = 股息。当余数的符号与最初的股息不同时,我会更正。 -10:2 产生 11111011 商,0000000 余数预校正。 11111100 Q,11111110 余数校正后。在这种情况下,我不需要更正,但无论如何算法都需要它。 产生不正确的结果。应该更正,但不是因为余数和股息都是负数。我不禁再次注意到,余数为0的循环。 【参考方案1】:

算法有效,问题是 2s 补码有一个负零。如果最后的余数为 0,则不需要更正。但是该算法必须在循环内检测到 0 余数,如果遇到,则始终需要进行更正。

刚刚添加了一个 0 余数标志并这样做了:

if (!Remainder.isEmpty() && (zeroFlag || (Dividend.Sign() XOR Remainder.Sign())))
      ...do corrections

【讨论】:

2 的补码没有负零。 1 的补码也是如此,符号幅度也是如此。 这实际上是关于签名非恢复除法方案中的后更正的有价值的答案。通常根本不考虑零部分余数或最终余数的情况,例如 google.ru/search?q=computer+arithmetics+behrooz+parhami+pdf ,尽管在那里考虑了正常的后校正。如果没有零余数校正后的情况,该算法最终会给出与真实答案相差 +-1 的错误结果(我现在只考虑商,而不是结果余数)。所描述的修复似乎在 100% 的情况下返回正确的商。

以上是关于非恢复有符号整数除法后校正的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode第二十九题-整数除法

有符号 32 位元素的 AVX __m256i 整数除法

Python中整数运算除法,输出带浮点数

C中的除法,商和余数的大小符号如何确定

有效地实现下限/欧几里得整数除法

Java中整数之间的除法