схема вычитания с плавающей точкой отрицательных чисел - PullRequest
0 голосов
/ 31 декабря 2011

вероятно, неправильное место, чтобы спросить, но я постараюсь.
Я должен спроектировать схему, которая бы добавляла / вычитала число с плавающей точкой Я пытался сделать это, используя числа со знаком в стандарте IEE 754. Они довольно большие, поэтому я решил начать с чего-то меньшего, чтобы доказать концепцию.
Я нашел несколько алгоритмов в сети для выполнения сложения и вычитания положительных чисел.
Большинство выглядит так: http://meseec.ce.rit.edu/eecc250-winter99/250-1-27-2000.pdf ,
Они не объясняют, что происходит со знаковым битом. Теперь я очень смущен. Согласно тому, что я нашел в сети, нет разницы в исполнении:

A-B and A- (-B)

Может кто-нибудь помочь мне с ссылкой, где алгоритм подробно объясняется?

спасибо за все ответы Я нашел это алгебраическое объяснение полезным http://howardhuang.us/teaching/cs231/08-Subtraction.pdf
В настоящее время моя схема выполняет A + B (без учета знакового бита) и A-B так же, как написал kfmfe04. Я делаю XORing B и добавляю 1, так что я получаю результат в 2C.
Во втором PDF-файле предлагается включить бит знака в операции add / sub. Я попробую это утром.
Проведя так много часов, тренируя свой мозг, я чувствую себя немного уставшим и не могу думать прямо. Теперь мне просто интересно, стоит ли мне изменить мою схему так, чтобы:
Переключатель кнопки добавления / подписки по-прежнему XOR B [a + (- b)], но также и перед этой частью я XOR мантисс с их знаком, чтобы преобразовать их в 2с.
Таким образом, я мог бы охватить случай вычитания отрицательных чисел (-A) - (- B).
Хотя звучит сложно.

1 Ответ

0 голосов
/ 31 декабря 2011

Основной принцип заключается в том, что внутри у вас есть часть сложения и вычитания.Обе процедуры работают только с положительными числами.

Ниже, ADD и SUB используются для обозначения внутренних процедур.Вы должны разделить операцию на разные случаи, в зависимости от того, являются ли операнды положительными или отрицательными:

Для сложения:

pos1 + pos2 => pos1 ADD pos1
pos1 + neg2 => pos1 SUB abs(neg2)
neg1 + pos2 => pos2 SUB abs(neg1)
neg1 + neg2 => - (abs(neg1) ADD abs(neg2))

Для вычитания:

pos1 - pos2 => pos1 SUB pos2
pos1 - neg2 => pos1 ADD abs(neg2)
neg1 - pos2 => - (abs(neg1) ADD pos2)
neg1 - neg2 => abs(neg2) SUB abs(neg1)

Конечно, вы также можете просто определить «A - B» как «A + -B» и реализовать только случаи для сложения.

...