Сейчас мы сделаем дополнение к статье о однобайтных числах с плавающей запятой Число стандарта IEEE 754 одинарной точности имеет настолько много бит, что проще обьяснить как работает суммирование чисел с плавающей запятой на примере наименьшего представления числа с плавающей запятой.
Сложение - это просто! Предположим, что вам необходимо сложить два числа с плавающейй точкой X и Y.
Например показатель степени Y меньше или равен показателю степени X. Пусть показатель Y будет равен у, а Х соответсвенно х
Алгоритм сложения выглядит следующим образом:
Добавить разность x-y к экспоненте числа Y. Сдвинуть мантиссу числа Y на x-y разрядов для компенсирования изменений в экспоненте.
Сложим следующие два числа:
Переменная | Знак | Экспонента | Мантисса |
X | 0 | 1001 | 110 |
Y | 0 | 0111 | 000 |
Еще раз пройдем все шаги:
В нормализованном виде X равен 1,110х22 , и Y является 1.000х20
Добавить разность x-y к экспоненте числа Y. Сдвинуть мантиссу числа Y на x-y разрядов для компенсирования изменений в экспоненте.
Разность экспонент 2. Итак, добавим 2 к показателю Y, и сдвинем точку скрытой единицы влево на 2. Таким образом получим 0,0100х22. Это эквивалентно старому значению Y . Назовем это скорректированным значением Y'
Добавим 1,110 к 0,01. Сумма: 10,0. Экспонента по-прежнему равна показателю экспоненты числа X, которая в свою очередь равна двум.
В нашем случае сумма 10,0 имеет два бита слева от точки. Чтобы нормализовать число нам нужно, переместить точку влево на 1 разряд, и увеличить экспоненту на 1. Итоговый результат: 1,000 х 23 .
Сумма | Знак | Экспонента | Мантисса |
X + Y | 0 | 1010 | 000 |
Сложим следующие два числа:
Переменная | Знак | Экспонента | Мантисса |
X | 0 | 1001 | 110 |
Y | 0 | 0110 | 110 |
Еще раз пройдем все шаги:
В нормализованном виде X равен 1,110х22 , и Y является 1,000х2-1
Добавить разность x-y к экспоненте числа Y. Сдвинуть мантиссу числа Y на x-y разрядов для компенсирования изменений в экспоненте.
Разность экспонент 3. Итак, добавим 3 к показателю Y, и сдвинем точку скрытой единицы влево на 3. Таким образом получим 0,0100х23. Это эквивалентно старому значению Y . Назовем это скорректированным значением Y'
Добавим 1,110 к 0,00111. Сумма: 1,11111. Экспонента по-прежнему равна показателю экспоненты числа X, которая в свою очередь равна двум.
В нашем случае сумма 1,11111 имеет один бита слева от точки. Таким образом число уже представлено в нормализованном виде и нам не нужно производить дополнительных действий. Итоговый результат: 1,111111х23 .
У нас есть только 3 бита для представления мантиссы, но у нас в ответе 5 бит. Очевидно, это похоже на необходимость аппаратного округления числа с плавающей запятой.
Но для простоты, мы обрежем дополнительные два бита. После усечения, мы получаем 1,111х2+2. Представим это в формате с плавающей точкой.
Сумма | Знак | Экспонента | Мантисса |
X + Y | 0 | 1010 | 111 |
Этот пример иллюстрирует то, что происходит, если показатели экспоненты слишком различаются. В самом деле, если показатель экспоненты отличается на 4 и более, то эффективно добавлять 0 к большему из двух чисел.
До сих пор мы рассматривали только добавления двух неотрицательные числа. Что происходит с отрицательными значениями?
Если вы делаете это на бумаге, то суммирование происходит как обычно. Просто сделайте нормализованное сложение или вычитание.
Если это на аппаратном уровне, вы конвертируете мантиссы в вид дополнения до двух, и выполнить сложение, сохраняя при этом позицию скрытой единицы (читайте о представлении чисел с фиксированной запятой.)
Помогает ли показатель смещения в суммировании чисел с плавающей запятой? Основная трудность заключается в вычислении разности показателей. Тем не менее, это не так сложно, потому что мы можем просто сделать беззнаковое вычитание. По большей части, смещение не вызывает слишком много проблем.
Возможны ситуации, когда результатом является переполнение (результат, который слишком велик, чтобы быть представленым) или значение числа теряется (результат меньше по величине, чем наименьшее ненормализованное, но не равное нулю). Реальная аппаратура содержит определенные правила, чтобы справиться с этим. Мы не будем беспокоиться об этом и просто признаем, что это может произойти.
Сложение двух чисел с плавающей точкой не так уж и сложно. Основная сложность состоит в приведении чисел с меньшей экспонентой (назовем такое число Y) к тем, которые имееют большую экспоненту (назовем такое число Х), и смещение точки мантиссы Y влево для компенсации.
После того, как сложение сделано, нам, возможно, придется перенормировать и усечь биты, если количество битов превышает формат числа для представления.
Если различие в показателе экспонент слишком велико, то суммирование X + Y имеет конечный результат равный X
Реальная аппаратура для работы с числами с плавающей точкой использует более изощренные средства, чтобы произвести округление суммы. Мы берем простое усечения битов, если есть больше битов, чем можно представить.