2012-04-22 3 views
1

Я не могу исправить пост-исправления для невосстанавливающего целочисленного деления. По какой-то причине я продолжаю получать случаи, когда исправляю, когда исправления не требуются или не корректируются при необходимостиНевосстанавливаемое целочисленное разделение с пометкой

heres псевдокод алгоритма. Dividend - 16 бит и другие 8 бит. К Dividend_Sign, Remainder_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; 

теперь им в точке, где я в основном имеют правильный ответ, он просто должен быть пост-исправлен в той или иной форме ... или нет после скорректированной на всех. Я не уверен, что все случаи исправления. Прямо сейчас у меня есть что-то, что Isnt рабочую половину времени, но здесь это все равно:

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

+0

Не могли бы вы уточнить, или по крайней мере перечислить, случаи, которые не работают? –

+0

atm found -10: 2 и -10: -2 - правильная предварительная коррекция, и исправление испортит ее. -16: 4 нужно исправить, но не делает. Я думаю, что это имеет какое-то отношение к ним, имеющим 0 остатков. – ollo

+0

Пожалуйста, объясните требования, которые вам понадобятся для остальной части после завершения коррекции (игнорируя на данный момент КАК эта коррекция). –

ответ

1

Алгоритм работы, задача 2с дополнение имеет отрицательный нуль. Если последний остаток равен 0, никаких исправлений не требуется. Но алгоритм должен обнаруживать 0 остатков в циклах, и если кто-то встречается, исправления всегда необходимы.

Просто добавил флаг в 0 остатков и сделал это:

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

В дополнении 2 нет отрицательного нуля. 1 дополняет и делает знак-величину. –

+0

Это действительно ценный ответ на посткоррекции в подписанной схеме восстановления без восстановления. Обычно случай для нулевого частичного остатка или окончательного остатка вообще не рассматривается, например http://www.google.ru/search?q=computer+arithmetics+behrooz+parhami+pdf, хотя нормальное postcorrection считается там. Без случаев постобработки без остатка алгоритм в конечном итоге дал бы неправильные результаты, которые отличались бы от -1 до истинного ответа (теперь я рассматриваю только фактор, а не результат). Описанное исправление, похоже, возвращает правильный коэффициент в 100% случаев. – lvd

 Смежные вопросы

  • Нет связанных вопросов^_^