Назад в библиотеку

Суммирование чисел с плавающей запятой

Источник: http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BinMath/addFloat.html
Автор перевода: Ковалев А. А.

Введение

Сейчас мы сделаем дополнение к статье о однобайтных числах с плавающей запятой Число стандарта IEEE 754 одинарной точности имеет настолько много бит, что проще обьяснить как работает суммирование чисел с плавающей запятой на примере наименьшего представления числа с плавающей запятой.

Сложение - это просто! Предположим, что вам необходимо сложить два числа с плавающейй точкой X и Y.

Например показатель степени Y меньше или равен показателю степени X. Пусть показатель Y будет равен у, а Х соответсвенно х

    Алгоритм сложения выглядит следующим образом:

  1. Представить числа в нормированном виде. Таким образом мы явно представляем скрытую единицу.
  2. Для продолжения процесса суммирования нам необходимо, чтобы экспоненты двух чисел были равны, мы делаем это переписывая значение Y. Это денормализует Y, но значение соответсвует нормализованному Y.

    Добавить разность x-y к экспоненте числа Y. Сдвинуть мантиссу числа Y на x-y разрядов для компенсирования изменений в экспоненте.

  3. Сложение двух мантисс чисел X и скорректированного Y.
  4. Если сумма на предыдущем этапе смещает единицу нормализации, то необходимо сдвинуть экспоненту, и повторить суммирование.
  5. Конвертирование в однобайтную форму представления числа с плавающей запятой

Пример 1

Сложим следующие два числа:

Переменная Знак Экспонента Мантисса
X 0 1001 110
Y 0 0111 000

Еще раз пройдем все шаги:

  1. Представить числа в нормированном виде. Таким образом мы явно представляем скрытую единицу.

    В нормализованном виде X равен 1,110х22 , и Y является 1.000х20

  2. Для продолжения процесса суммирования нам необходимо, чтобы экспоненты двух чисел были равны, мы делаем это переписывая значение Y. Это денормализует Y, но значение соответсвует нормализованному Y.

    Добавить разность x-y к экспоненте числа Y. Сдвинуть мантиссу числа Y на x-y разрядов для компенсирования изменений в экспоненте.

    Разность экспонент 2. Итак, добавим 2 к показателю Y, и сдвинем точку скрытой единицы влево на 2. Таким образом получим 0,0100х22. Это эквивалентно старому значению Y . Назовем это скорректированным значением Y'

  3. Сложение двух мантисс чисел X и скорректированного Y.

    Добавим 1,110 к 0,01. Сумма: 10,0. Экспонента по-прежнему равна показателю экспоненты числа X, которая в свою очередь равна двум.

  4. Если сумма на предыдущем этапе смещает единицу нормализации, то необходимо сдвинуть экспоненту, и повторить суммирование.

    В нашем случае сумма 10,0 имеет два бита слева от точки. Чтобы нормализовать число нам нужно, переместить точку влево на 1 разряд, и увеличить экспоненту на 1. Итоговый результат: 1,000 х 23 .

  5. Конвертирование в однобайтную форму представления числа с плавающей запятой
    Сумма Знак Экспонента Мантисса
    X + Y 0 1010 000

Пример 2

Сложим следующие два числа:

Переменная Знак Экспонента Мантисса
X 0 1001 110
Y 0 0110 110

Еще раз пройдем все шаги:

  1. Представить числа в нормированном виде. Таким образом мы явно представляем скрытую единицу.

    В нормализованном виде X равен 1,110х22 , и Y является 1,000х2-1

  2. Для продолжения процесса суммирования нам необходимо, чтобы экспоненты двух чисел были равны, мы делаем это переписывая значение Y. Это денормализует Y, но значение соответсвует нормализованному Y.

    Добавить разность x-y к экспоненте числа Y. Сдвинуть мантиссу числа Y на x-y разрядов для компенсирования изменений в экспоненте.

    Разность экспонент 3. Итак, добавим 3 к показателю Y, и сдвинем точку скрытой единицы влево на 3. Таким образом получим 0,0100х23. Это эквивалентно старому значению Y . Назовем это скорректированным значением Y'

  3. Сложение двух мантисс чисел X и скорректированного Y.

    Добавим 1,110 к 0,00111. Сумма: 1,11111. Экспонента по-прежнему равна показателю экспоненты числа X, которая в свою очередь равна двум.

  4. Если сумма на предыдущем этапе смещает единицу нормализации, то необходимо сдвинуть экспоненту, и повторить суммирование.

    В нашем случае сумма 1,11111 имеет один бита слева от точки. Таким образом число уже представлено в нормализованном виде и нам не нужно производить дополнительных действий. Итоговый результат: 1,111111х23 .

  5. Конвертирование в однобайтную форму представления числа с плавающей запятой

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

    Но для простоты, мы обрежем дополнительные два бита. После усечения, мы получаем 1,111х2+2. Представим это в формате с плавающей точкой.

    Сумма Знак Экспонента Мантисса
    X + Y 0 1010 111

    Этот пример иллюстрирует то, что происходит, если показатели экспоненты слишком различаются. В самом деле, если показатель экспоненты отличается на 4 и более, то эффективно добавлять 0 к большему из двух чисел.

Отрицательные значения

До сих пор мы рассматривали только добавления двух неотрицательные числа. Что происходит с отрицательными значениями?

Если вы делаете это на бумаге, то суммирование происходит как обычно. Просто сделайте нормализованное сложение или вычитание.

Если это на аппаратном уровне, вы конвертируете мантиссы в вид дополнения до двух, и выполнить сложение, сохраняя при этом позицию скрытой единицы (читайте о представлении чисел с фиксированной запятой.)

Смещение

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

Переполнение / потеря значимости

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

Резюме

Сложение двух чисел с плавающей точкой не так уж и сложно. Основная сложность состоит в приведении чисел с меньшей экспонентой (назовем такое число Y) к тем, которые имееют большую экспоненту (назовем такое число Х), и смещение точки мантиссы Y влево для компенсации.

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

Если различие в показателе экспонент слишком велико, то суммирование X + Y имеет конечный результат равный X

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