Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 [ 76 ] 77 78 79 80 81 82 83 84 85 86 87

/ S е /

1 8 23 1 11 52

Знаковый бит равен О для положительных чисел и 1 для отрицательньк. Смещенный показатель степени е и дробная часть / представляют собой величины, старший бит которых находится слева. Числа с плавающей точкой кодируются в соответствии со стандартом ШЕЕ так, как показано ниже.

ЧИСЛА С ПЛАВАЮЩЕЙ ТОЧКОЙ

Бог создал целые числа; все остальные - дело рук человеческих. Леопольд Кронекер (Leopold Кгопескег)

Выполнение операций над числами с плавающей точкой с помощью целочисленной арифметики и логических команд - предложение далеко не лучщее. Особенно это относится к правилам и форматам стандарта ШЕЕ Standard for Binary Floating-Point Arithmetic, ШЕЕ Std. 754-1985, общеизвестного как "ШЕЕ-арифметика". В этой арифметике имеется число NaN (not а number, не число) и бесконечности, которые представляют собой частные случаи практически для всех операций. В ней есть плюс ноль и минус ноль, которые должны быть эквивалентны при сравнении, кстати имеющем в ШЕЕ-арифметике четвертый возможный результат- "неупорядочено". Старший значащий бит дроби в "нормальных" числах явно не участвует, но участвует в "денормализован-ных" и "субнормальных" числах. Дробные части представлены в виде обычных чисел со знаком, в то время как показатели степени - в смещенном виде. На все это, конечно, есть свои причины, но в результате получаются программы, заполненные условными переходами, которые очень сложно эффективно реализовать.

В данной главе предполагается, что читатель немного знаком со стандартом ШЕЕ, так что о нем будет сказано предельно коротко.

15.1. Формат IEEE

Ограничимся рассмотрением чисел одинарной и двойной точности (32 и 64 бита), описанных в ШЕЕ 754. В стандарте представлены также "расширенный одинарный" и "расширенный двойной" форматы, но их описание весьма неточно в связи с тем, что ряд деталей зависит от реализации (например, ширина показателя степени не определена стандартом). Ниже показаны одинарный и двойной форматы чисел с плавающей точкой.

Формат Формат

с одинарной точностью с двойной точностью



Одинарная точность

Двойная точность

Значение

Значение

±0

42- (0./)

±2-"(0./)

от 1 до 254

42-" (1./)

от 1 до 2046

42-°- (1./)

2047

±«.

2047

В качестве примера рассмотрим кодирование числа л в формате с одинарной точностью. В соответствии с [38], в двоичном представлении

л =» 11.0010 0100 0011 1111 ОНО 1010 1000 1000 1000 0101 10100011 0000 10...

Эта величина находится в диапазоне "нормализованных" чисел, представленном третьей строкой приведенной выше таблицы. Старший единичный бит числа л опускается, поскольку ведущий единичный бит не хранится при кодировании нормализованных чисел. Чтобы двоичная точка размещалась в правильном месте, показатель степени е -127 должен быть равен 1, так что е = 128. Таким образом, представление числа л выглядит как

о 10000000 10010010000111111011011

или в шестнадцатеричной записи:

40490FDB,

где дробь округлена до ближайшего представимого числа.

Числа, для которых \ <е< 254, называются "нормализованными". Старший бит таких чисел не хранится явно. Ненулевые числа с е = 0 называются "денормализованными", и их старший бит хранится в представлении числа в явном виде. Такая схема иногда называется схемой с "постепенной потерей значимости" (gradual underflow). В табл. 15.1 приведены некоторые крайние значения из различных диапазонов чисел с плавающей точкой. "Максимальное целое" в приведенной таблице означает наибольшее целое число, такое, что все целые числа, не превосходящие его по абсолютному значению, представимы в виде чисел с плавающей точкой точно; следующее за ним число уже должно быть округлено.

Таблица 15.1. Некоторые предельные значения чисел с плавающей точкой

Шестнадцатеричное представление

Точное значение

Приближенное значение

Одинарная точность

Наименьшее денормализованное

0000 0001

2-149

1.401x10-*

Наибольшее денормализованное

007F FFFF

2-(1-2-")

l.nSxIO-

Наименьшее нормализованное

0080 0000

2-126

l.nSxlO"

3F80 0000

Максимальное целое

4В80 0000

2"

1.677x10



Шестнадцатеричное представление

Точное значение

Приближенное значение

Одинарная точность

Наибольшее нормализованное

7F7F FFFF

2 (1-2-)

3.403x10

7F80 0000

Двойная точность

Наименьшее денормализованное

0...0001

2-1074

4.941x10""

Наибольшее денормализованное

OO0F...F

2-<«з(1 2-«)

2.225x10-™

Наименьшее нормализованное

0010...0

2-1022

2.225x10-™

3FF0...0

Максимальное целое

4340. . .0

9.007x10"

Наибольшее нормализованное

7EEF...F

2.024 2-53

1.798x10™

7FF0...0

Для нормализованных чисел единица в последней позиции представляет собой относительное значение в диапазоне от l/2" до 1/2 (примерно от 5.96x10-* до 1.19x10-)

для одинарной точности и от l/2" до l/2" (примерно от 1.11x10"" до 2.22x10"") для двойной точности. Максимальная "относительная ошибка" при округлении к ближайшему числу составляет половину приведенной величины.

Диапазон целых чисел, точно представимых в формате с плавающей точкой, составляет от -2"* до +2" (т.е. от-16777216 до +16777216) для одинарной точности и от -2" до +2" (от -9007199254740992 до +9007199254740992) для двойной точности. Конечно, некоторые целые числа вне этого диапазона также могут быть представлены точно, например большие степени 2; однако указанные диапазоны являются максимальными диапазонами, все числа которых представимы точно.

Замена деления на константу умножением может быть вьшолнена с полной (ШЕЕ) точностью только для чисел, для которых соответствующие множители могут быть точно представлены в формате с плавающей точкой. Это степени 2 от -127 до 127 для одинарной точности и от -1023 до 1023 для двойной. Заметим, что числа 2"" и 2-°" являются денормализованными, так что их использования лучше избегать на машинах, которые недостаточно эффективно реализуют операции над денормализованными числами.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 [ 76 ] 77 78 79 80 81 82 83 84 85 86 87