Выполнение арифметических операций над числами с фиксированной запятой
Система команд МК позволяет относительно легко осуществлять операции над целыми числами (сложение, вычитание и т.д.). Однако в большинстве реальных задач необходимо хранить и обрабатывать дробные числа. Для этого в формат числа вводится «виртуальная» запятая, отделяющая целую и дробную часть двоичного числа (N . M), где N – один байт целой части числа, а M – один байт дробной. При вычислениях необходимо выбрать такой формат чисел с фиксированной запятой, чтобы при максимальной величине операндов не происходило переполнение разрядной сетки (кроме переполнения при вычитании (сложении) в доп. коде, которое отбрасывается).
Сложение и вычитание
При сложении и вычитании чисел относительное положение запятой не изменяется. Перед использованием стандартной процедуры целочисленного сложения или вычитания необходимо произвести «выравнивание» операндов. Если для вычислений нужно сформировать дополнительный код числа, то следует это делать после выравнивания операндов. (NN.M+N.MM=NN.MM, 0.MM+N.0=N.MM)
Пример. сложить 7,2510 + 1,510 в формате 1 байт под целую часть и один – под дробную.
7,2510 = 00000111 . 01000000
1,510 = 00000001 . 10000000, при сложении получим
8,7510 = 00001000 . 11000000
Пример. Вычесть из 8,7510 число 1,510 в формате 1 байт под целую часть и один – под дробную.
Сначала выравниваем операнды, а затем выписываем доп. код для отрицательного числа (-1,5).
8,7510 = 00001000 . 11000000
1,510 = 00000001 . 10000000, обр. код: 11111110 . 01111111, доп. код: 11111110 . 10000000
складываем:
8,7510 = 00001000 . 11000000
-1,510 = 11111110 . 10000000 (в доп. коде)
получим:
7,2510 = 1 00000111 . 01000000 (отбрасываем 1-цу переполнения в соответствии с правилами вычитания чисел в доп. коде).
Умножение
При умножении двух целых чисел с фиксированной запятой положение «виртуальной» запятой меняется и его необходимо отслеживать. Зная форматы операндов нужно определить положение запятой в формате результата. NN.M ´ N.MM = NNN.MMM, 0.MM ´ N.M = N.MMM и т.д.
Пример. умножить 7,510 на 1,510 в формате 1 байт под целую часть и один – под дробную.
7,510 = 00000111 . 10000000
1,510 = 00000001 . 10000000, при умножении получим
00000111 . 10000000
´ 00000001 . 10000000
__________________
00000111 10000000
+ 00000111 10000000
________________________________
00000000 00001011 01000000 00000000
Деление
При делении двух чисел с фиксированной запятой сначала необходимо определить (задать) сколько знаков после запятой будет содержать результат. Если результат должен содержать k цифр после запятой, то делимое следует сдвинуть влево k раз. Это относится и к случаю, когда делимое меньше делителя. NNNN.000 : NN = NN.MMM (k знаков после запятой), 0.MMM : NN.M = 0.MMMMM, NNNN.000 : N.MM = NNN.M и т.д.
Пример. разделить 1010 = 0102 на 410 = 1002. (k=2)
1010002:1002 (делимое сдвинули влево два раза)
101000 | 100
100 | 10 . 10 2 = 2.510.
- 0
- 100
- 0
Алгоритм деления: сравниваем временный результат (ВР) с делителем (Д). Если ВР<Д, то сдвигаем 1 раз влево ВР и делимое как единое целое, а в результат вдвигаем лог.0 в мл. бит. Если ВР³Д, то вычитаем Д из ВР, а затем сдвигаем 1 раз влево ВР и делимое как единое целое, а в результат вдвигаем лог.1 в мл. бит.
временный результат | делимое комментарии
00000000 | 101000 ВР<Д, => сдвигаем (результат - _ _ _ _ _ _ _ _)
00000001 | 01000 ВР<Д, => сдвигаем (результат - _ _ _ _ _ _ _ 0)
00000010 | 1000 ВР<Д, => сдвигаем (результат - _ _ _ _ _ _ 0 0)
00000101 | 000 ВР³Д, => вычитаем и…
- 100 |
00000001 | 000 … и сдвигаем (результат - _ _ _ _ _ 0 0 1)
00000010 | 00 ВР<Д, => сдвигаем (результат - _ _ _ _ 0 0 1 0)
00000100 | 0 ВР³Д, => вычитаем и…
- 100 |
00000000 | 0 … и сдвигаем (результат - _ _ _ 0 0 1 0 1)
00000000 | ВР<Д, => сдвигаем (результат - _ _ 0 0 1 0 1 0)
отсчитываем два знака (k=2) справа у результата и ставим запятую. Получим 10.102 = 2.510.
При представлении чисел с фиксированной запятой все разряды ячейки, кроме знакового разряда, если он есть, служат для изображения разрядов числа. Причем каждому разряду ячейки соответствует всегда один и тот же разряд числа. Именно поэтому такое представление получило название с фиксированной запятой, так как фиксируется место запятой перед определенным разрядом (для целых чисел запятая находится после младшего разряда, т.е. вне разрядной сетки). Такая система упрощает выполнение арифметических действий, но сильно ограничивает диапазон чисел, которые можно записать в ячейку при таком представлении.
Дата добавления: 2016-12-27; просмотров: 4452;