Арифметические операции с числами в формате с плавающей запятой
Сложение и вычитание
Производятся в несколько этапов:
1) Выравниваются порядки чисел в сторону большего (чтобы не получить мантиссы > 1)
2) Складываются мантиссы. Для представления отрицательных чисел используется модифицированный дополнительный код. Порядок суммы будет равен общему порядку слагаемых.
3) Нормализуется результат: порядок и мантисса изменяются так, чтобы первая значащая цифра результата попала в первый разряд после запятой.
Пример 1: Вычесть из числа A = 20.0 число B = 11.0.
A = 20 = 101002 = .101 * 25 = .101 * 10101 (все числа –двоичные)
B = 11 = 10112 = .1011 * 24 = .1011 * 10100
Процессор для определения разности порядков вычитает из порядка числа A порядок числа B и получает 1. Т.к. порядок числа A на единицу больше порядка числа B, порядок числа B увеличивается на 1 и мантисса при этом сдвигается на 1 разряд вправо относительно точки:
B = .01011 * 10101
Мантисса числа B должна быть записана как отрицательное число (нужно выполнить вычитание):
B = -010110…0 = 1|101001…1 = 1|101010…0
Обратный код Дополнительный
Сложение мантисс в модифицированном дополнительном коде:
00| 1010 00…0 (число A)
+ 11| 1010 10…0 (число B)
1| 00| 0100 10…0 (сумма, порядок = 1012)
Произошло нарушение нормализации.
Нормализация результата: мантисса сдвигается влево, порядок уменьшается: A - B = .1001* 10100 = 10012 = 9.0
Пример 2: Сложить A = 5.0 и B = 28.0.
A = 5 = 1012 = .101 * 25 = .101 * 1011 (все числа –двоичные)
B = 28 = 111002 = .111 * 25 = .111 * 10101
Процессор для определения разности порядков вычитает из порядка числа A порядок числа B и получает -2. Т.к. порядок числа A на 2 меньше порядка числа B, порядок числа A увеличивается на 2 и мантисса при этом сдвигается на 2 разряда вправо относительно точки:
A = .00101 * 10101
Сложение мантисс в модифицированном коде:
00| 0010 10…0 (число A)
+ 00| 1110 00…0 (число B)
01| 0000 10…0 (сумма, порядок = 1012)
Произошло нарушение нормализации.
Нормализация результата: мантисса сдвигается вправо, порядок увеличивается: A + B = .100001* 10110 = 1000012 = 33.0
При сложении и вычитании чисел с плавающей запятой при сложении мантисс переполнение не фиксируется. Переполнение может возникнуть в процессе нормализации, если порядок превысит максимально допустимый.
Умножение и деление
При умножении чисел в формате с плавающей запятой порядки складываются, а мантиссы перемножаются, затем результат нормализуется.
При делении из порядка делимого вычитается порядок делителя, а мантисса делимого делится на мантиссу делителя, затем результат нормализуется.
Двоично-десятичное кодирование информации
Двоично-десятичный код — ( binary-coded decimal [BCD] ) форма записи целых чисел, когда каждый десятичный разряд числа записывается в виде его четырёхбитного двоичного кода (вместо каждой десятичной цифры записывают ее двоичное значение). Например, десятичное число 310 будет записано в двоичном коде как 1001101102, а в двоично-десятичном коде как 0011 0001 0000BCD.
Преимущества и недостатки
Преимущества
· Упрощён вывод чисел на индикацию — вместо последовательного деления на 10 требуется просто вывести на индикацию каждый полубайт. Аналогично, проще ввод данных с цифровой клавиатуры.
· Для дробных чисел (как с фиксированной, так и с плавающей запятой) при переводе в человекочитаемый десятичный формат и наоборот не теряется точность.
· Упрощены умножение и деление на 10, а также округление.
По этим причинам двоично-десятичный формат применяется в калькуляторах — калькулятор в простейших арифметических операциях должен выводить в точности такой же результат, какой подсчитает человек на бумаге.
Недостатки
- Усложнены арифметические операции.
- Требует больше памяти.
- В двоично-десятичном коде BCD существуют запрещённые комбинации битов:
Запрещённые в BCD битовые комбинации:
1010 1011 1100 1101 1110 1111
Запрещённые комбинации возникают обычно в результате операций сложения, так как в BCD используются только 10 возможных комбинаций 4-х битового поля вместо 16. Поэтому, при сложении и вычитании чисел формата BCD действуют следующие правила:
- При сложении двоично-десятичных чисел каждый раз, когда происходит перенос бита в старший полубайт, необходимо к полубайту, от которого произошёл перенос, добавить корректирующее значение 0110.
- При сложении двоично-десятичных чисел каждый раз, когда встречается недопустимая для полубайта комбинация, необходимо к каждой недопустимой комбинации добавить корректирующее значение 0110 с разрешением переноса в старшие полубайты.
- При вычитании двоично-десятичных чисел, для каждого полубайта, получившего заём из старшего полубайта, необходимо провести коррекцию, вычитая значение 0110.
Пример операции сложения двоично-десятичных чисел:
Требуется: Найти число A = D + C, где D = 3927, C = 4856
Решение: Представим числа D и C в двоично-десятичной форме: D = 3927 = 0011 1001 0010 0111 C = 4856 = 0100 1000 0101 0110
Суммируем числа D и С по правилам двоичной арифметики:
* ** 0011 1001 0010 0111+ 0100 1000 0101 0110 ___________________= 1000 0001 0111 1101 - Двоичная сумма+ 0110 0110 - Коррекция ___________________ 1000 0111 1000 0011
'*' — тетрада, из которой был перенос в старшую тетраду
'**' — тетрада с запрещённой комбинацией битов
В тетраду, помеченую символом *, добавляем шестёрку т.к по правилам двоичной арифметики перенос унёс с coбой 16, а по правилам десятичной арифметики должен был унести 10. В тетраду, помеченую символом ** , добавляем шестёрку, так как комбинация битов 1101 (что соответствует десятичному числу 13) является запрещённой.