Pull to refresh

Нужна ли нормализация в числах с плавающей точкой?

Reading time 4 min
Views 16K
В прошлом топике (1 ) мы говорили о числах с плавающей точкой/запятой, нормализованных в соответствии со стандартом IEEE754. Там же были рассмотрены денормализованные числа, искусственное введение которых в стандарте привело к чудовищным программно-аппаратным затратам, тормозящим процессы компьютерной обработки чисел в десятки и сотни раз. Но, так уж ли нужна эта самая нормализация и тем более оправдано ли введение экзотического класса денормализованных чисел в компьютерную арифметику? Попробуем разобраться с этим вопросом.

Напомним, что в предыдущей статье, для простоты изложения, нами были введены следующие понятия. Область машинной мантиссы (ОММ) — это область машинного слова, в которую записывается мантисса числа. Область машинного порядка (ОМП) — это область машинного слова, в которую записывается порядок характеристики числа. Далее, в тексте, мы будем использовать эти понятия.

Итак, как известно, любое число, записанное в естественном виде, может быть представлено в эквивалентном ему экспоненциальном виде:

F = М∙ q^(±h)

где М представляет собой число, записанное в естественном виде, со смещенной точкой на h позиций в ту или иную сторону. Число М в такой записи принято называть мантиссой числа, а q^(±h) характеристикой числа с порядком ±h. Знак и величина порядка h компенсируют величину смещения точки относительно ее первоначального положения в числе, представленном в естественном виде

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

Предположим, что мы имеем некоторое двоичное число, записанное в экспоненциальном виде с мантиссой, имеющей N разрядов и порядком характеристики, равным h. Рассмотрим случай, когда N≥К., т.е., если число значащих цифр мантиссы записываемого числа превышает или равно количеству разрядов ОММ.
Например, пусть нам необходимо записать в машинное слово, в котором В =3, К=4 двоичное число, представленное в естественной форме как 11.011. В этом числе количество значащих цифр превышает количество разрядов ОММ. В экспоненциальном виде это число может иметь различные варианты записи, такие как: 11011•2^(-3); 11.011•2^0; 0.0011011•2^4; и проч.

Для того, чтобы число 11011.•2^(-3) записать в машинное слово с дробной мантиссой, необходимо точку в мантиссе числа смещать влево до тех пор пока в старшем разряде ОММ ни появится единица. На количество смещений точки необходимо откорректировать порядок характеристики мантиссы в ОМП. В нашем случае точку необходимо сместить на 5 разрядов влево. В ОМП тогда будет записано число 5-3=2. А в машинном слове, таким образом, будет записано число 0.1101•2^2. Младшая единица не вместилась в разрядную сетку ОММ и была потеряна. Аналогично будем иметь для числа 11.011•2^0. Чтобы его записать в наше машинное слово необходимо сместить точку на два разряда влево и соответственно увеличить порядок тоже на 2. В результате в машинном слове будет записано число 0.1101•2^2. Чтобы записать в машинное слово число 0.0011011•2^4, точку в нем необходимо сдвинуть на два разряда вправо, а порядок уменьшить также на 2. В результате, мы опять получаем записанное в машинном слове число 0.1101•2^2.

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

Пусть теперь N<К. Число, удовлетворяющее этому условию, может быть записано в машинное слово различным образом.

Например, в машинном слове, в котором В =3, К=4, число 0.01 может быть представлено следующими вариантами:

0.1000 •2^(-1), 0.0100 •2^0, 0.001•2^1, 0.0001•2^2.

Ну и что? Почему нас это должно смущать? Все эти варианты записи числа 0.01 математически эквивалентны и, будучи использованными в математических преобразованиях, дают правильный результат.

Действительно, пусть в машинном слове число 0.01 представлено как 0.1000 •2^(-1). Сложим это число с двоичным числом 0.011, которое в машинном слове записано, как 0.11•2^(-1). Получим следующий результат:

0.1000 •2^(-1) + 0.11•2^(-1) = 1.01•2^(-1).

Поскольку старшая цифра числа вышла за рамки разрядной сетки ОММ, мы должны сместить точку на один разряд влево, а значение порядка увеличить на 1. В результате, в машинном слове будет записано число 0.1010•2^0.

Допустим теперь, что двоичное число 0.01 представлено в машинном слове в виде 0.0001•2^2. Сложим его с числом 0.011, которое теперь представлено в машинном слове как 0.0011•2^1. По правилам арифметики приведем порядки слагаемых к одинаковому значению и сложим преобразованные таким образом числа:

0.001•2^1+0.0011•2^1=0.0101•2^1.

Полученное в результате сложения число математически эквивалентно ранее полученному числу 0.1010•2^0 и может быть записано в машинное слово без дополнительных преобразований.

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

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

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

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

ЛИТЕРАТУРА.
1. habrahabr.ru/post/262245
2. wiki.mvtom.ru/index.php/Формы_представления_чисел_в_ЭВМ
3. 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.
4. www.softelectro.ru/ieee754.html
5. neerc.ifmo.ru/wiki/index.php?title=Представление_вещественных_чисел&printable=yes

Юрий Спиридонов.
Tags:
Hubs:
+3
Comments 33
Comments Comments 33

Articles