Число с плавающей запятой представляется в виде мантиссы (М) и порядка (П).
Например, число А = 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. Отсюда вытекает следующая последовательность действий.
Т.к. |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.
Рассмотрим особые случаи при делении чисел с плавающей запятой
Т.к. |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.
Рассмотрим несколько примеров сложения/вычитания чисел с плавающей запятой в десятичной системе счисления.
(0,3*103) + (0,98*104) = (0,03 *104)+(0,98*104) = 1,01 * 104 = 0,101* 105
(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 | + | - | + |
Из анализа таблицы можно сделать вывод, что
В настоящее время для представления чисел с плавающей запятой используется версия стандарта IEEE 754-2008.
Этот стандарт определяет
Стандарт описывает
и некоторые другие особенности работы с такими числами.
В данном разделе мы рассмотрим лишь некоторые из них, которые либо уже использовались нами при выполнении тех или иных операций, либо каким-либо образом влияют на кодирование числа в ЭВМ.
Стандарт IEEE 754 определяет четыре формата представления чисел с плавающей запятой:
Рассмотрим форматы, наиболее часто используемые чисел: с одинарной, двойной и двойной расширенной точностью (Рис. 10.2)
(рис 10.2) Формат числа с плавающей запятой согласно ГОСТ 754
Размеры полей для чисел разных форматов представлены в Табл. 10.2.
| Точность | Одинарная single-precision | Двойная double-precision | Двойная расширенная double-extended precision |
|---|---|---|---|
| Размер (байты) | 4 | 8 | 10 |
| Поле порядка (бит) | 8 | 11 | 15 |
| Поле мантиссы (бит) | 23 | 52 | 63 |
| Наибольшее значение | 3,4×10+38 | 1,7×10+308 | 1,1×10+4932 |
| Максимальная относительная погрешность | 10-7 | 10-16 | 10-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 | АЛУ ФТ |
| 8 | 9,1*1018...+9*1018 | FPU | |
| С плавающей точкой | 4 (1+8+23) знак-порядок-мантисса | ±3,37*1035 | FPU |
| 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 и вытекающие из этого представления особенности хранения и обработки таких чисел.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.