1

非復元整数除算の事後修正がわかりません。どういうわけか、修正が必要ないところを修正したり、必要なときに修正しない場合があります。

ここにアルゴリズムの擬似コードがあります。Dividend16ビットと他の8ビットです。つまりDividend_SignRemainder_SignMSBが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

4

1 に答える 1

1

アルゴリズムは機能します。問題は、2の補数に負のゼロがあることです。最終的な余りが0の場合、修正は必要ありません。ただし、アルゴリズムはサイクル内で0の余りを検出する必要があり、1つが発生した場合は、常に修正が必要です。

0の剰余フラグを追加し、これを実行しました。

if (!Remainder.isEmpty() && (zeroFlag || (Dividend.Sign() XOR Remainder.Sign())))
      ...do corrections
于 2012-04-25T21:55:10.317 に答える