Информационные основы вычислительной техники

Арифметические операции над числами с плавающей запятой

Показывать лекцию целиком

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

Число с плавающей запятой представляется в виде мантиссы (М) и порядка (П).

Например, число А = 123 может быть представлено в виде числа с мантиссой 12,3 и порядком +1, то есть 12,3 *10+1. Другие представления этого самого же числа могут выглядеть так: 123 = 123*100 = 1230 10-1 = 0,123*10+3 = 0, 0123 * 10+4 = ...

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

Нормализованная мантисса должна удовлетворять условию:

$$1 \gt \left|M_p\right| \geq p^{-1}$$

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

Из приведенного выше примера этому условию удовлетворяет лишь запись

А = 0,123*10+3

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

(рис 10.1) Структура числа с плавающей запятой

Порядок представляет собой число с фиксированной точкой, мантисса – число с фиксированной запятой. Поэтому:

Ммакс = 0,1 ... 1 = 1-2-n

Ммин = 2-1 (напомним, что мантисса должна быть нормализована).

Пмакс = 0,1 ... 1 = 2m-1

макс = -(2m-1)

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

В данном случае достаточно просто определить диапазон представляемых чисел

$$X_{макс} = M_{макс}\cdot 2^{П_{макс}} = (1-2^{-n})\cdot2^{2^{m}-1}\approx2^{2^{m}}$$ $$X_{мин} = M_{мин}\cdot 2^{П_{макс}} = 2^{-1}\cdot 2^{-m-1}$$

Абсолютная погрешность представления числа с плавающей запятой ЭВМ составит:

$$\triangle X\leq(2^{-1}\cdot 2^{-m}\cdot 2^{П_x}$$

Относительная погрешность представления в ЭВМ числа с плавающей запятой будет равна:

$$\delta \left[Х\right]_{мин} = \triangle\left[Х\right]/ (М_{макс}\cdot 2^{П{_x }})= (2^{-1} \cdot2^{-m})\cdot 2^{П{_x}} / ((1 - 2^{-m})\cdot 2^{П{_x }} ) \approx 2^{-1}\cdot 2^{-m}$$ $$\delta \left[Х\right]_{макс} = \triangle\left[Х\right]/ (М_{мин}\cdot 2^{П{_x }})= (2^{-1} \cdot2^{-m})\cdot 2^{П{_x}} / (2^{-1}\cdot 2^{П{_x }} ) = 2^{-m}$$

Таким образом, мы видим, что для чисел с плавающей запятой диапазон их представления весьма широк и определяется в основном, количеством разрядов, отводимых под порядок числа, а относительная погрешность меняется гораздо меньше, чем для чисел с фиксированной точкой (всего в 2 раза) и определяется количеством разрядов, отводимых под запись мантиссы числа.

Умножение чисел с плавающей запятой

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

(0,3*103) * (0,2*102) = (0,3 * 0,2) *103+2 = 0,06 * 105 = 0,6* 104

Последний шаг выполнен для нормализации мантиссы результата.

Таким образом, если представить операнды в двоичной системе счисления как

$$X=M_{x}\cdot 2^{П{_x }}$$ $$Y=M_{y}\cdot 2^{П{_y }}$$

а произведение мы хотим тоже получить в виде числа с плавающей запятой, то есть

$$Z=X\cdot Y=M_{z}\cdot 2^{П{_z }}$$

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

Пz = Пx + Пy

Mz = Mx * My

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

Ряд этих случаев будем рассмотрен нами при обсуждении ГОСТа IEEE 754 на представление чисел с плавающей запятой [ ...]. В то же время иногда подобные ситуации возникают в процессе выполнения самой операции, а окончательный результат оказывается допустимым числом. Рассмотрим все эти случаи.

Особые случаи при умножении чисел с плавающей запятой

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

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

1 > |Mx,y| ≥ 2-1,

то 1 > |Mz| = |Mx| * |My| ≥ 2-2.

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

  • Пz = Пx + Пy
  • Если Пz = - ∞, то Z=0 .
  • Если Пz = + ∞, то продолжить умножение, так как последующая операция над мантиссами может привести к коррекции порядка результата в сторону его уменьшения и, тем самым, обеспечит нормальное представление числа в целом.
  • Mz = Mx * My
  • Т.к. |Mx| ≥ 2-1, |My| ≥ 2-1, то |Mz| ≥ 2-2

    Возможная область ненормализованной мантиссы:

    2-1 > |Mz| ≥ 2-2

    Если |Mz| < 2-1, то выполнить нормализацию мантиссы с одновременной коррекцией порядка:

    |Mz| = |Mz| * 2+1

    Пz = Пz -1

    Если в результате получим Пz = - ∞, то Z=0.

    Если в ходе перемножения мантисс получим |Mz| ≥ 2-1 , но ранее при обработке порядков получили Пz = + ∞ (см п.1.2), то Z = ∞

    При Z=0 выполнение программы в ЭВМ продолжается.

    При Z = ∞ устанавливается флаг прерывания, и ЭВМ приостанавливает обработку данных чисел.

    Деление чисел с плавающей запятой

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

    (0,6*105) * (0,2*102) = 3 * 105-2 = 0,3 * 104

    Последний шаг выполнен для нормализации мантиссы результата.

    Таким образом, если представить операнды в двоичной системе счисления как

    $$X = M_x \cdot 2^{П{_х}}$$ $$Y = M_y \cdot 2^{П_{y}},$$

    а частное мы хотим тоже получить в виде числа с плавающей запятой, то есть

    $$Z = X \cdot Y = M_z \cdot 2^{П_{z}}$$

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

    Пz = Пx - Пy

    Mz = Mx / My

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

    Предполагая, что мантиссы обоих операндов нормализованы, то есть удовлетворяют условию

    1 > |Mx,y| ≥ 2-1,

    мы получим

    2 > |Mz| = |Mx| / |My| ≥ 2 -1

    Таким образом, если в результате деления мантисс и потребуется нормализация (в случая, если 2 > |Mz| ≥ 2-1), то она может быть выполнена сдвигом вправо не более чем на один разряд. При этом к порядку должна быть добавлена единица. Обычно такая ситуация проверяется на первом шаге деления мантисс. Для чисел с фиксированной запятой ситуация, когда |Mx| ≥ |My| приводит к приостановке деления и выработке сигнала особого случая, который обрабатывается системным программным обеспечением ЭВМ. В случае чисел с плавающей запятой такая ситуация ведёт к коррекции мантиссы делимого (Mx' = Mx / 2) и соответствующему изменению порядка (Пx' = Пx + 1) с последующим делением мантиссы Mx' на Y.

    Рассмотрим особые случаи при делении чисел с плавающей запятой

  • Пz = Пx - Пy
  • Если Пz = +∞, то Z = ∞
  • Если Пz = -∞, то продолжить деление, так как в последующем возможно увеличение порядка за счет того, что мантисса X окажется больше или равной мантиссе Y.
  • Mz = Mx / My
  • Т.к. |Mx| ≥ 2-1, |My| ≥ 2-1, то 2 > |Mz| ≥ 2-1

    Возможная область ненормализованной мантиссы:

    2 > |Mz| ≥ 1

    Если |Mz| ≥ 1, то выполнить нормализацию мантиссы с одновременной коррекцией порядка:

    |Mz| = |Mz| * 2-1; Пz = Пz + 1.

    Если в результате получим Пz = +∞, то Z = ∞.

    Если в ходе деления мантисс получили Пz = -∞, и Пz = Пz +1 = -∞, то Z = 0.

    Если в ходе деления мантисс получили |Mz| < 1, и при обработке порядков получили Пz = -∞, то Z = 0.

    Сложение/вычитание чисел с плавающей запятой

    $$X=M_{x}\cdot 2^{П{_x }}$$ $$Y=M_{y}\cdot 2^{П{_y }}$$ $$Z=X\pm Y=M_{z}\cdot 2^{П{_z }}$$

    Рассмотрим несколько примеров сложения/вычитания чисел с плавающей запятой в десятичной системе счисления.

    Пример 1.

    (0,3*103) + (0,98*104) = (0,03 *104)+(0,98*104) = 1,01 * 104 = 0,101* 105

    Пример 2.

    (0,3333*103) - (0,331*103) = 0,002*103 = 0,2* 101

    Порядок выполнения и особые случаи при сложении/вычитании чисел с плавающей запятой

  • Определение разности порядков:

    ΔП = Пx – Пy

    Если ΔП = +∞, то Пx >> Пy, и Z = X.

    Если ΔП = -∞, то Пy >> Пx, и Z = Y.

  • Денормализация мантиссы числа с меньшим порядком:

    Если ΔП > 0, то Пx > Пy, Пz = Пx, M'y = My*2 - ΔП, M'x = Mx.

    Если ΔП < 0, то Пy > Пx, Пz = Пy, M'x = Mx*2 - |ΔП|, M'y = My .

    Если ΔП = 0, то Пz = Пx = Пy. Денормализации мантисс не происходит: M'x = Mx, M'y = My.

  • Алгебраическое суммирование чисел с равными порядками:

    Mz = M'x ± M'y

    Если |Мz| ≥ 1, то |M'z| =|Мz| * 2-1, П'z = Пz+1.

    Если П'z = +∞, то Z = ∞.

    Если П'z = -∞, то Z = 0.

  • Приведем в качестве примера некоторые мантиссы (Табл. 10.1), представленные в различных кодах, и укажем, нормализованы ли они (+ означает нормализованную мантиссу, - ненормализованную).

    Двоичный код мантиссы числаПКОКДК
    0.101+++
    1.101+--
    0.010---
    1.010-++
    0.100+++
    1.100+-+

    Из анализа таблицы можно сделать вывод, что

  • нормализованная мантисса, представленная в прямом коде, имеет первый знак после запятой, равный единице;
  • нормализованная мантисса, представленная в обратном или дополнительном кодах, должна иметь первый знак после запятой, не совпадающий со знаковым разрядом. Исключение составляет число 1.10...0 для мантиссы в дополнительном коде.
  • Особенности представления чисел с плавающей запятой согласно стандарту IEEE 754

    В настоящее время для представления чисел с плавающей запятой используется версия стандарта IEEE 754-2008.

    Этот стандарт определяет

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

  • как представлять нулевые числа (без наличия такой возможности представить число Z=0 в виде числа с плавающей запятой невозможно, так как нормализованная мантисса числа с плавающей запятой должна быть отлична от нуля);
  • как представлять специальную величину бесконечность (Infiniti);
  • как представлять специальную величину "Не число" (NaN или NaNs); к этому понятию относятся символы и результаты недопустимых операций;
  • режимы округления при выполнении операций
  • и некоторые другие особенности работы с такими числами.

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

    Стандарт IEEE 754 определяет четыре формата представления чисел с плавающей запятой:

  • с одинарной точностью (single-precision);
  • с двойной точностью (double-precision);
  • с одинарной расширенной точностью (single-extended precision) >=43 бит (редко используемый);
  • с двойной расширенной точностью (double-extended precision) >= 79 бит (обычно используют 80 бит).
  • Рассмотрим форматы, наиболее часто используемые чисел: с одинарной, двойной и двойной расширенной точностью (Рис. 10.2)

    (рис 10.2) Формат числа с плавающей запятой согласно ГОСТ 754

    Размеры полей для чисел разных форматов представлены в Табл. 10.2.

    ТочностьОдинарная single-precisionДвойная double-precisionДвойная расширенная double-extended precision
    Размер (байты)4810
    Поле порядка (бит)81115
    Поле мантиссы (бит)235263
    Наибольшее значение 3,4×10+381,7×10+3081,1×10+4932
    Максимальная относительная погрешность10-710-1610-19

    Отметим несколько моментов в машинном представлении числа с плавающей запятой. Как мы указывали ранее, число с плавающей запятой может иметь как порядок, так и мантиссу в виде числа со знаком. На Рис. 10.2 представлено поле для кодирования только одного знака. И это является знаком мантиссы, то есть знаком самого числа. Знак порядка неявно закодирован в поле самого порядка в виде так называемого смещенного, или машинного порядка:

    Псм = Пx + Δ,

    где Псм – смещенный порядок, закодированный в соответствующем поле числа в ячейке памяти или регистре компьютера, Пx – истинный порядок числа, значение Δ выбирается таким образом, чтобы любой смещенный порядок стал неотрицательным, то есть Δ = |-Пx|макс.

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

    Еще один момент, который хотелось бы здесь отметить, связан с понятием нормализованной мантиссы, которое используется в этом ГОСТе.

    Так, при обсуждении выше в этой лекции порядка и особенностей выполнения основных арифметических операций над числами с плавающей запятой и возникающих при этом особых случаях мы опирались на понятие нормализованной мантиссы в соответствии с (12.1). Согласно ГОСТ 754 мантисса двоичного числа считается нормализованной, если она удовлетворяет следующему условию:

    $$2 \gt\left |M_2\right| \geq 1$$

    Т. е. модуль нормализованной мантиссы всегда имеет целую часть, равную единице.

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

    Операции над такими числами необходимо проводить с учетом данного обстоятельства.

    В Табл. 10.3 показана связь между представлением чисел различных форматов и местом их обработки в ЭВМ.

    Тип данныхРазмер, байтДиапазонБлок обработки
    Целые без знака

    1

    2

    4

    0...255

    0...65535

    0...4,3*109
    АЛУ ФТ
    Целые со знаком

    1

    2

    4

    -128...+127

    -32768...+32767

    2,1*109...+2,1*109
    АЛУ ФТ
    89,1*1018...+9*1018FPU
    С плавающей точкой

    4 (1+8+23)

    знак-порядок-мантисса

    ±3,37*1035FPU
    8 (1+11+52)±1,67*10308
    10 (1+15+64)±1,1*104932
    Двоично-десятичные числа

    1 распакованный

    1 упакованных

    10 упакованных

    0...9

    0...99

    0...9...9 (18 цифр)

    АЛУ ФТ

    АЛУ ФТ

    FPU

    Числа с двойной расширенной точностью используются для обработки упакованных двоично-десятичных данных в FPU (Floating Point Unit – блоке для обработки данных с плавающей точкой (запятой) микропроцессора). При этом сами данные размещаются в поле мантиссы (разряды с нулевого по 63-й), а знак числа повторяется во всех разрядах с 64-го по 79-й.

    Краткие итоги

    В лекции рассмотрены арифметические операции обработки чисел с плавающей запятой: алгебраическое сложение, умножение, деление. Особое внимание уделено особым ситуациям, возникающим в процессе выполнения этих операций, методам их обработки. Дано представление чисел с плавающей запятой согласно ГОСТ 754 и вытекающие из этого представления особенности хранения и обработки таких чисел.

    Вопросы и задания

  • Укажите формат числа с плавающей запятой. Какую характеристику числа определяет количество разрядов, отводимых под его порядок, а какую – под его мантиссу?
  • Для чего требуется нормализация мантиссы числа с плавающей запятой?
  • Определите минимальное количество разрядов, которое необходимо для представления числа 534,2110 с точностью 1%.
  • Укажите особые случаи при умножении чисел с плавающей запятой. Каковы пути их решения? Какое устройство занимается этим?
  • Укажите особые случаи при делении чисел с плавающей запятой. Каковы пути их решения?
  • Каким образом при алгебраическом сложении производится денормализации мантиссы числа с меньшим порядком? При ответе учитывать, что на уровне схемотехники в распоряжении разработчика имеются регистры сдвига лишь на один разряд.
  • Определите величину константы, которая используется для чисел одинарной, двойной и расширенной точности, чтобы превратить истинный порядок числа с плавающей запятой в машинный.
  • Представьте число (-0,01510) в следующей разрядной двоичной сетке (1 - 3 - 5 – знак - порядок машинный - мантисса) согласно ГОСТ 754.
  • Вернуться к учебному плану