Алгоритм работы с плавающей запятой. Часть 2

Категория: Теория цифровой техники
Автор: MAZ Просмотров: 993

  Простейшие арифметические операции с числами в показательной форме. Общие понятия. 

3.1 Сложение

Обычно эта операция с числами в показательно форме осуществляется в четыре этапа.

1. Уравниваются порядки слагаемых: младший порядок увеличивается до большего. При этом соответствующим образом корректируется мантисса преобразуемого числа.

2. Выполняется преобразование мантисс в дополнительные коды.

3. Производится суммирование мантисс по правилам для чисел с фиксированной запятой.

4.К сумме мантисс приписывается порядок слагаемых и, в случае необходимости, производится нормализация результата.

Возможны два случая денормализации: (т.е. сумма приняла не нормализованный вид, надо ее перевести в нормализованный)

а) денормализация влево, соответствующая переполнению разрядной сетки.

Её наличие определяется теми же способами, что и переполнение разрядной сетки.

а) денормализация вправо, возникающая, когда в прямом коде мантиссы после запятой имеется один или несколько нулевых разрядов. Здесь характерно одинаковое значение разрядов мантиссы по обе стороны от запятой.

Давайте разбираться по пунктам и пытаться сформировать основы будущего алгоритма сложения.

1. Уравниваются порядки слагаемых: младший порядок увеличивается до большего. При этом соответствующим образом корректируется мантисса преобразуемого числа.

Имеется два слагаемых, это понятно, складываем же. Так как нужно порядки чисел сделать одинаковыми, то естественно надо корректировать мантиссу.

А как порядки сделать одинаковыми? Предполагаю, что для начала их надо сравнить. Логично предположить, что порядок меньшего слагаемого надо уровнять с порядком большего слагаемого ( по модулю конечно). Тогда мантисса меньшего слагаемого сдвинется вправо на число двоичных разрядов, равное разности порядков. Пока на этом не зацикливаюсь, дальше разберемся. Буду считать все числа положительные.

Применительно для разрабатываемого алгоритма действий нам надо определить:

1.1 У какого слагаемого больше порядок. Это не сложно, вычесть числа порядков и проверить бит С регистра Status. Если бит С=1, то уменьшаемое больше вычитаемого и наоборот.

Значит, возможно два развития событий:

- уменьшаемое больше вычитаемогорезультат вычитания это есть количество разрядов для сдвига мантиссы вычитаемого числа

- уменьшаемое меньше вычитаемогорезультат вычитания необходимо инвертировать и прибавить единицу, опять получим количество разрядов для сдвига мантиссы уменьшаемого числа

результат: Мы узнали какое слагаемое меньше и насколько разрядов надо сдвинуть запятую мантиссы этого числа по разрядной сетки вправо.

1.2. Как сдвинуть мантиссу и изменить порядок меньшего слагаемого.

Для упрощения наших рассуждений, считаем, что под мантиссу отведен старший байт числа, а под порядок младший байт числа.

Тогда для сдвига мантиссы ( имею ввиду запятую) надо выполнить команду сдвига вправо на число разности порядков, полученное в пункте1.

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

результат: Мы преобразовали меньшее слагаемое, уравняли порядки, но число не изменилось, т.к. был сдвиг запятой на число разности порядков.

2. Выполняется преобразование мантисс в дополнительные коды.

Что это за дополнительные коды?

Напомню, что понятие кода применяется к числам с различными знаками.

Существует прямой, обратный и дополнительный коды.

Прямой код, когда дополняют число в двоичной форме знаковым разрядом,

который равен нулю для положительных чисел и единицы для отрицательных.

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

Дополнительный код, когда к младшему разряду отрицательного числа в обратном коде ( после инвертирования) прибавляется единица.

Приведу примеры этих кодов, чтобы было понятно. Мы же будем в дальнейшем работать с положительными и отрицательными числами.

Условимся знаковый разряд числа располагать слева и отделять точкой.

Как это будет выглядеть с байтом.

Прямой код:                      +8010=0.01010000;   - 8010=1. 01010000;

Обратный код:                                                     - 8010=+17510=0. 10101111

Дополнительный код:                                         - 8010=+17610=0. 10110000                        

Логично предположить, что раз мы выполняем сложение. А числа могут быть как отрицательные, так и положительные, то для устранения неоднозначности сложения необходимо отрицательные числа перевести в положительные. Это удобно сделать как раз в дополнительном коде.

Возвращаемся к наброску алгоритма.

2.1. Определяем, если в слагаемых отрицательные числа.

Опрашиваем бит в котором мы определили записывать знак числа, первого и второго слагаемых.

Возможно два варианта, есть отрицательные числа или их нет.

- если нет то переходим на сложение мантисс

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

результат: Мы избавились от отрицательного числа, перевели его в дополнительный код. На будущее, прикинули это и к порядкам.

2.2. Производим суммирование мантисс.

Мы это умеем, просто сложение однобайтных чисел, но тут возникает одна проблема. Проблема переноса, т.е. если сумма чисел будет больше 256, флаг С просигнализирует, что число полученное после сложения не может уместится в одном байте. Но по логике вычисления мантиссы мы не можем уйти из границы одного байта и организовать еще один байт для хранения полученной суммы. Произойдет переполнение разрядной сетки.

Т.е. какая то ненормальная денормализация влево. Как её победить?

Честно говоря, не знаю. Но чтобы выкрутится, из этой ситуации предполагаю, что при оформлении бита мантиссы надо пользоваться следующим правилом. Старший бит байта мантиссы всегда должен быть свободен.

Тогда при сложении бит С мы запишем в старший бит. Это у нас прекрасно получится. Число которое мы можем записать в поле мантиссы не будет больше 12710. (в степени 25610). Сразу видны ограничения 16 битного представления числа в показательной форме.

Делаем вывод на будущее, если использовать показательную форму для вычислений, то необходимо, под мантиссу отводить не меньше 9 разрядов двухбайтного числа. Или еще лучше пользоваться 24 разрядными или 32 разрядными числами.

Набросок работы есть. Можно заходить на следующий круг. Чтобы не искать легких путей, будем работать сразу с 32 разрядами.

Если отведем на порядок 1 бит (степень 256), то запятую можно отодвинуть на 256 разрядов, но зачем такие астрономические цифры. Будем кроить порядок. Отводим один разряд под знак мантиссы, один разряд под знак порядка. И т.к. мы определились, что мантисса на всякий случай должна иметь один старший бит свободный, получается, порядок равен 5 разрядам.

Т.е. мы можем записать в 32 разрядной сетке

Мантиссу в 24 разряда и порядок в 5 разрядов.

Т.е. число 0,16777215х 1031 это максимально возможное отображаемое числа.

167772150000000000000000000000010

Я думаю больше чем достаточно, и даже не по себе. Как его назвать?

Дальше буду располагать мантиссу, порядок, и знаки в разрядную сетку.

Т.к. с самого начала эта работа планировалось как коллективная, .

Жду на форуме, вопросов, замечаний, если ошибки. Может перейти на 8 или 16 битную мантиссу?


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2019 © ChipMK.ru

ChipMk.ru Яндекс Метрика