[Из песочницы] Взгляд со стороны: Стандарт IEEE754
Вопросам представления действительных чисел в формате с плавающей точкой/запятой, который закреплен в стандарте IEEE754, посвящено немало работ. В том числе и на Хабрахабре. Не являясь программистом, автор попытался разобраться с этим зверем с точки зрения простой школьной математики. Отталкиваясь не от утвержденных в стандарте форматов, а от естественных представлений о числах. Возможно, что такой взгляд со стороны будет интересен и профессионалам-программистам. Особенно это касается вопросов, связанных с денормализованными числами.
1.ЕСТЕСТВЕННАЯ И ЭКСПОНЕНЦИАЛЬНАЯ ФОРМЫ ЗАПИСИ ЧИСЕЛ
Из математики известно, что любое действительное число F в позиционной системе счисления с основанием q записывается на бумаге в виде последовательности цифр. Вес цифры зависит от ее позиции в числе. Основание системы q равно количеству цифр (знаков ее алфавита) и определяет, во сколько раз различаются значения цифр соседних разрядов числа. Такая запись числа называется естественной и выглядит следующим образом:
F = c_(L-1,) c_(L-2)…c_(0.) d_(0)…d_(N-2,) d_(N-1,) (1)
Где c_(L-1,) c_(L-2)…c_0- цифры целой части, а d_(0)…d_(N-2,) d_(N-1) — цифры дробной части числа. Число может состоять из сколь угодно большого количества значащих цифр L целой части и N цифр дробной части.
Если точку в числе F, представленном выражением (1) переместить на h разрядов влево, то мы получим новое число М, которое связано с первоначальным числом формулой, представляющей собой экспоненциальную зависимость:
М=F• q^(-h)
Значение числа F при этом уменьшится в h раз. Чтобы число не изменилось, его умножают на величину q^h. Таким образом, число, записанное в естественном виде (1), может быть представлено в эквивалентном ему экспоненциальном виде:
F=М• q^h
Если точку в числе F, представленном выражением (1) переместить на h разрядов вправо, то мы получим новое число М, которое связано с первоначальным числом формулой:
М=F• q^h
Значение числа F при этом увеличится в h раз. Чтобы число не изменилось, его умножают на величину q^(-h). Таким образом, для рассматриваемого случая, число, записанное в естественном виде (1), может быть представлено в следующем эквивалентном ему экспоненциальном виде:
F=М• q^(-h)
В общем случае, любое действительное число, записанное в естественной форме (1), может быть записано в эквивалентном ему экспоненциальном виде следующим образом:
F = М∙ q^(±h) (2)
где М представляет собой число (1) со смещенной точкой на h позиций в ту или иную сторону. Число М в такой записи принято называть мантиссой числа, а q^(±h) характеристикой числа с порядком ±h, который в литературе еще называют экспонентой. Знак и величина порядка h компенсируют величину смещения точки относительно ее первоначального положения в числе (1). Обе записи (1) и (4) суть записи одного и того же числа различным образом.
Число (1) имеет L + N разрядов. Поскольку в естественном представлении числа (1) число разрядов L целой части и N разрядов дробной части могут иметь сколь угодно большое значение, то число M в (2) также может иметь сколь угодно большое количество разрядов. В общем случае, количество разрядов числа М в (2) может быть бесконечным. Например, когда число представляет собой периодическую дробь, или число иррационально. На практике мы имеем дело с ограниченным количеством разрядов для представления действительного числа в естественной форме. Сколько бы разрядов числа мы ни писали справа, рано или поздно мы должны ограничить количество разрядов представляемого числа. Хотя бы потому, что писать будет уже некуда. В результате, число сначала ограничивают, а затем округляют до приемлемой для данной задачи крайней правой цифры. При этом, конечно, теряется точность представления этого числа. Вопросы точности представления чисел в математике мы здесь не затрагиваем. Этому вопросу посвящено огромное число работ. Отметим только, что точность представления числа выбирается в разумных пределах и поэтому действительное число всегда записывается с ограничением разрядности. Тем самым, строго говоря, оно становится рациональным числом. В компьютерной литературе, числа, имеющие дробную часть, принято называть действительными числами. Мы тоже будем придерживаться этой терминологии.
В математике, как правило, к представлению чисел в экспоненциальном виде прибегают тогда, когда число, записанное в естественном виде (1), имеет незначащие нули. Чтобы сократить запись и не писать повторяющиеся незначащие цифры используют запись числа в экспоненциальной форме (2). Тогда порядок характеристики h указывает на количество незначащих нулей до или после точки. В более общем случае, число h со знаком, как мы видели выше, указывает на количество смещений точки относительно ее первоначального положения в числе. В любом случае, когда указывается число сдвигов h, всегда известна и точка отсчета, относительно которой происходит смещение разделительной точки в числе.
2. ПРЕДСТАВЛЕНИЕ ЧИСЕЛ В МАШИННОМ СЛОВЕ
В вычислительном устройстве для записи числа отводится ограниченное разрядное пространство. Поэтому на числа, записываемые в машинное слово, накладываются определенные ограничения, которые определяют точность представления чисел и диапазон принимаемых ими значений.
Двоичное число, представленное в экспоненциальном виде, в компьютере записывается в виде машинного слова, разбитого на специальные области. Структура машинного слова может быть схематично представлена следующим образом:
В этом слове К разрядов отводится для записи мантиссы M, R разрядов под запись порядка h характеристики и по одному разряду отводится под запись знака S числа и z знака порядка. Машинное пространство, выделенное под запись мантиссы числа, будем называть областью машинной мантиссы (ОММ), а число, записанное в эту область, машинной мантиссой. Аналогично, пространство, выделенное в машине под запись порядка характеристики, будем называть областью машинного порядка (ОМП) характеристики, а число, записанное в эту область будем называть машинным порядком. Если в ОММ в явном виде содержится точка, то числа, представленные в таком формате, называются числами с фиксированной точкой. Далее мы будем рассматривать числа, записанные в экспоненциальном виде (2). Числа, представленные в таком формате, называют еще числами с плавающей точкой.
3. НОРМАЛИЗАЦИЯ ЧИСЕЛ
Как уже отмечалось выше, при преобразовании числа, записанного в естественном виде, к экспоненциальному виду, точка в числе вида (1) может смещаться на произвольное количество разрядов вправо или влево. А, чтобы значение числа при этом не изменилось, на количество смещений должен быть откорректирован порядок характеристики экспоненциального числа. Очевидно, что при этом возникает множественность представления одного и того же числа, записанного в экспоненциальном виде.
Возьмем двоичное число 0.001001 и запишем его в экспоненциальном виде в машинное слово, в котором ОММ имеет 3 разряда. В том случае, когда предполагается, что машинная мантисса представлена в виде правильной дроби, мы будем иметь следующие возможные варианты записи этого числа: 0.1001•2^(-2)=0.100•2^(-2)=0.010•2^(-1)=0.001•2^0. Во всех этих случаях младший разряд записываемого числа был утерян, поскольку он вышел за пределы разрядной сетки ОММ. Итак, мы получили запись одного и того же числа различными вариантами.
Налицо неоднозначность представления чисел в машинном слове. Мы должны указать машине критерий выбора, по которому отдается предпочтение той или иной форме записи числа в машинном слове. Запись экспоненциального числа в формате, в котором мантисса числа представляется единственным образом, называется нормализацией.
В настоящее время чаще всего рассматриваются два варианта нормализации чисел. В первом варианте [1], перед записью в машинное слово число представляется в виде двоичного дробного числа, в котором единица стоит сразу после точки. При такой нормализации двоичная мантисса в виде правильной дроби лежит в диапазоне 0.1≤М< 1. Другой вариант нормализации заключается в следующем. Действительное число перед записью в машинное слово приводится к виду, в котором мантисса представляет собой смешанную дробь, в которой в младшем разряде целой части обязательно присутствует значащая цифра. Для двоичного числа эта цифра — единица. Такой вариант нормализации закреплен в стандарте IEEE754
4. ДЕЙСТВИТЕЛЬНЫЕ ЧИСЛА В ПРЕДСТАВЛЕНИИ СТАНДАРТА IEEE754
В настоящее время в компьютерной арифметике, для оперирования с действительными числами, широко используется стандарт IEEE754 [2]. В этом стандарте введен класс нормализованных чисел, который позволяет решить две проблемы. Одна из них, это неоднозначное представление чисел с плавающей запятой. А вторая проблема, это получение возможности представления чисел в широком диапазоне значений. Для решения этих проблем было предложено, перед записью в машинное слово действительного числа, приводить его к нормализованному виду.
Рассмотрим особенности представления действительных чисел с плавающей запятой в стандарте IEEE754.
В соответствие со стандартом, все числа в машинном слове представляются в нормализованном виде. Для этого они преобразуются к виду:
F = s ∙ 2^(±h)∙1.М
Здесь 1.М — мантисса, состоящая из единицы в целой части и числа М, которое записывается в ОММ сразу за единицей. Значения мантиссы в нормализованных числах располагаются в интервале:
1 ≤ 1.M < 2,
а значения порядков характеристик чисел лежат в диапазоне –(B-1) ≤ h ≤ B. Здесь B — максимальное число, которое можно записать в ОМП машинного слова.
Двоичное нормализованное число в машинном слове с К- разрядной ОММ схематично выглядит следующим образом:
Расположение разрядов для знака порядка z и знака числа S в машинном слове может быть произвольным. На характер представимых чисел это не влияет. Как видно из этого рисунка, К-ый разряд в мантиссе нормализованного числа всегда равен единице. Этот разряд присутствует в машинном слове виртуально. На самом деле его в разрядной сетке нет. Тем не менее, виртуальная единица всегда учитывается при представлении чисел и при проведении математических операций над ними. Предполагается, что в нормализованном числе точка в мантиссе расположена справа от единицы.
В стандарте, чтобы сэкономить на знаке порядка, используется смещенное представление порядков характеристик чисел, записанных в машинное слово. Для простоты изложения, значения порядков характеристик мы представляем здесь и далее без смещения.
При нормализованном представлении чисел сразу возникает проблема, связанная с отсутствием нуля. В нормализованных числах нуль не входит в интервал значений мантиссы. Это обстоятельство не позволяет получить нулевой результат вычислений. При математических операциях над нормализованными числами в компьютере нуль в явном виде не получается, а получается его признак.
И вторая проблема, которая возникает при нормализации чисел, это ограничение диапазона представления малых чисел, из-за того, что значения мантиссы нормализованных чисел не превышают единицы. Это заставило авторов стандарта ввести класс денормализованных чисел, что существенно усложнило алгоритмы работы с такими числами.
Минимальное нормализованное число, которое можно записать в машинное слово, выглядит схематично следующим образом:
Это число, с учетом положения неявной единицы, может быть представлено следующим выражением:
|F_min | = S 2^(-В) (1+0) = S 2^(-В)
Где В- максимальное число, записанное в ОМП. Число 2^(-В) в стандарте считается специальным числом, которое принимается за ±0. Знак при нуле принимает свое значение в соответствие со значением знака S числа. Далее, для простоты, мы будем рассматривать только положительные числа.
Минимальным положительным нормализованным числом в стандарте считается число вида:
Таким образом, минимальное нормализованное число в стандарте представлено формулой:
|F_min | = 2^(-(B-1))
Равенство порядка характеристики числу (-В) в стандарте зарезервировано под признак особого случая. Шаг, с которым изменяются значения нормализованных чисел равен ξ = 2^(-B)
Максимальное положительное нормализованное число в стандарте представлено в виде
Это число можно записать в виде выражения:
|F_max | = 2^В•(2–2^(-К))
Вычислим диапазон представимых чисел, нормализованных по стандарту:
|F_max |/|F_min | = 2^В• (2–2^(-К))/ 2^(-В+1) = 2^(2В )•(1- 2^(-(К+1))) ≈ 2^2В
Как мы видим, диапазон представимых нормализованных чисел определяется главным образом диапазоном чисел, которые можно записать в ОМП.
Отметим также, что даже при К = 1, когда мантисса числа содержит всего один разряд, выбирая соответствующее значение В можно записать или очень большое, или очень маленькое число. Образно говоря, мантисса в числе, представленном в экспоненциальном виде, по аналогии с географической картой, определяет количество объектов, которое мы рассматриваем, а коэффициент q^(±h) является масштабным коэффициентом, определяющим расстояние между этими объектами. С увеличением масштабного коэффициента q^(±h), при ограниченной площади карты (разрядности ОММ), становятся различимы более мелкие объекты (числа), а количество различимых объектов (чисел) уменьшается. В десятичной системе счисления часто, для описания количественных характеристик физических объектов, вместо коэффициента q^(±h) используют приставки нано, микро, мили, кило, мега и проч.
Для того, чтобы расширить диапазон представимых чисел в сторону близких к нулю значений, в стандарте введен класс денормализованных чисел. Денормализованными числами считаются числа, которые определяются по формуле:
F_den = 2^(-(В-1))•(M•2^(-К))
В этом выражении М — целое число, лежащее в диапазоне 1≤ М≤(2^(К-1)). А мантисса (M•2^(-К)), это дробное число, которое лежит в диапазоне
2^(-К) ≤(M•2^(-К))< 1- 2^(-К) (3)
Как отсюда видно, в выражении для денормализованных чисел отсутствует неявная единица. В момент, когда характеристика нормализованного числа становится равной 2^(-B) (особый случай), далее преобразования ведутся так, как будто характеристика числа равна 2^(-(B-1)). А значения дробной мантиссы лежат в диапазоне (3). Это позволяет перейти из области нормализованных чисел к области чисел денормализованных плавно, без скачка. В области денормализованных чисел шаг изменения чисел становится равным ξ = 2^(-(B-1+К)). Когда значение мантиссы денормализованного числа становится равным нулю, считается, что число равно машинному нулю.
Денормализованное положительное число в машинном слове схематично выглядит следующим образом:
Минимальное положительное денормализованное число в машинном слове выглядит как:
Формула для минимального денормализованного числа будет следующей:
F_(den min) = 2^(-(В-1+К)) = 2^(-(В+К-1))
Максимальное положительное денормализованное число выглядит в машинном слове схематично следующим образом:
Формула для вычисления максимального денормализованного числа имеет вид:
F_(den max) = 2^(-(В-1))(1-^(-К))
Диапазон представимых в стандарте денормализованных чисел равен:
F_(den max)/ F_(den min)= 2^(В-1) (1–2^(-К)) /2^(-(В+К-1)) = 2^(2B-2) (2^К-1)
Ниже, для примера, приводится таблица, в которой представлено преобразование последовательности чисел перед записью их в машинное слово, в соответствие со стандартом IEEE754. Предполагается, что ОММ состоит из К=2 разрядов, плюс неявная единица. В ОМП можно записать максимальное число В=2. Минимальное число, с которого начинается отсчет нормализованных чисел, будет |F_min | = 2^(-2+1) = 2^(-1)= 0.1. В таблице эта область представлена числами на белом фоне. С 1 строки по 3-ю, на сером фоне, в таблице представлена область денормализованных чисел, для которых F_(den min) = 2^(-(2+2–1))= 2^(-3). Шаг изменения для этих чисел равен ξ = 0.001.
В 1-ом столбце таблицы пронумерованы шаги изменения числа от минимального значения до максимального. В столбце 2 записаны числа, которые образуются с каждым новым шагом. Значок х здесь означает произвольную цифру, нуль или единицу. Цифры, обозначенные как х, не участвуют в образовании мантиссы машинного слова. В столбце 3 представлена мантисса числа, после его нормализации. В столбце 4 представлены значения порядков характеристик чисел после их нормализации. В столбце 5 представлены значения машинных порядков характеристик чисел, записанных в машинное слово. В столбце 6 представлены денормализованные числа, которые записываются в ОММ. В столбце 7 пронумерованы уникальные денормализованные числа, которые записаны в машинном слове. А в столбце 8 пронумерованы уникальные нормализованные числа.
Как следует из приведенных в таблице значений чисел, записанных в машинное слово, диапазон представимых двоичных нормализованных чисел равен 1.11•2^2/1.0•2^(-1)=7/0.5=14. В то же время диапазон вместе взятых нормализованных и денормализованных чисел будет равен 1.11•2^2/0.01•2^(-1)=7/0.125=56. Видно, что диапазон представимых чисел, определяемый, как отношение максимального представимого числа к минимальному не совпадает с количеством представимых чисел.
Глядя на таблицу можно заметить, что, пока машинный порядок равен минимальному значению (h= -1), увеличение на 1 значения мантиссы приводит к увеличению числа, записанного в машинном слове тоже на 1. После того, как число в стр. 2 станет равным двоичному числу 0.111, следующее его приращение на 1 дает число 1.000, которое не помещается в разрядную сетку ОММ. Поэтому мы сдвигаем точку в мантиссе числа на один разряд влево и увеличиваем машинный порядок на единицу. Далее изменение машинных чисел происходит с удвоенным значением шага. С каждым увеличением числа h на единицу происходит увеличение расстояния между соседними значениями машинных чисел вдвое.
ЛИТЕРАТУРА
1. wiki.mvtom.ru/index.php/Формы_представления_чисел_в_ЭВМ
2. IEEE Standard for Binary Floating-Point Arithmetic. Copyright 1985 by The Institute of Electrical and Electronics Engineers, Inc 345 East 47th Street, New York, NY 10017 USA.
3. www.softelectro.ru/ieee754.html
4. neerc.ifmo.ru/wiki/index.php? title=Представление_вещественных_чисел&printable=yes