Изменения

Перейти к: навигация, поиск

Представление вещественных чисел

1727 байт добавлено, 09:37, 26 января 2012
м
Нет описания правки
|colspan=4 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
Порядок записан [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код|со сдвигом]] '''-15'''. Это означает, что если дан порядок 01101То есть чтобы получить актуально значение порядка нужно вычесть из него сдвиг. Сдвиг можно получить по формуле <subtex>2^{b-1}-1</subtex> то он на самом деле равен не 13, а где <tex>b</tex> -2 число бит, отведенное на хранение порядка (потому как в случае числа половинной точности <tex>13-15b=-25</tex>).
'''Ограничения точности'''
|colspan=3 style="border: none; border-right: 1px solid gray; text-align: right"|0
|}
Порядок записан со сдвигом '''-127'''.
=== Денормализованные числа ===
'''Денормализованные числа''' (''denormalized\/subnormal numbers'') - это способ увеличить количество представимых числом с плавающей запятой значений около нуля, дабы повысить точность вычислений. Каждое значение денормализованного числа меньше самого маленького '''нормализованного''' ("обычного") значения числа с плавающей запятой.Согласно стандарту, если порядок равен своему минимальному значению (все его биты - нули, а порядок формально равен своему истинное значение порядка равно его сдвигу) и все биты мантиссы равны нулю, то это <tex>\pm0</tex>. Если же мантисса не равна нулю, то это число с порядком, на единицу большим минимального (все биты порядка, кроме младшего - нули) и данной мантиссой, '''целая часть которой считается равной нулю, а не единице'''.
То есть число с плавающей запятой, при учете вышесказанного, можно задать следующим образом:
Где <tex>s</tex> - бит знака, <tex>M</tex> - последовательность битов мантиссы, <tex>E</tex> - значение порядка (с учетом сдвига), <tex>E_{min}</tex> - минимальное значение порядка, используемое для записи чисел (1-''сдвиг'') , <tex>E_{min}-1</tex> - минимальное значение порядка, которое он в принципе может принять (все биты нули, 0-''сдвиг'').
<!-- Есть непроверенная информация, что денормализованные числа исключают ситуацию, при которой a+b=a, когда a и b - конечные числа отличные от нуля. Было бы неплохо сюда её добавить -->
Хоть денормализованные числа и позволяют бороться с погрешностями и обрабатывать очень маленькие значения, за эти возможности приходится дорого платить. Ввиду сложности денормализованные числа крайне редко реализуют на аппаратном уровне - вместо этого используются программные реализации, работающие значительно медленнее. <br/>
 
В современных процессорах обработка денормализованных чисел происходит в десятки раз медленнее, чем обработка нормализованных чисел. Ниже приведена таблица из [http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf статьи Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values" ''(англ.)'']
 
{| class="wikitable"
!Производитель||Процессор||Замедление (разы)
|-
|AMD||K6||1.4
|-
|IBM||PowerPC G4||1.4
|-
|IBM||BlueGene/L||1.9
|-
|IBM||Power||2.1
|-
|IBM||PowerPC 970||2.4
|-
|AMD||AthlonXP||5.5
|-
|AMD||Athlon||6.0
|-
|AMD||AthlonXP||7.1
|-
|Intel||Pentium 3 Xeon||14.5
|-
|Intel||Pentium 3||15.8
|-
|Alpha||EV67||20.5
|-
|AMD||Athlon 64||21.4
|-
|AMD||Athlon 64 X2||23.3
|-
|AMD||Opteron64||23.8
|-
|Alpha||PCA56||31.9
|-
|Intel||Core Duo||44.2
|-
|Intel||Pentium 4||92.2
|-
|Alpha||EV6.8||95.1
|-
|Intel||P4 Xeon||97.9
|-
|Intel||Pentium 4||131.0
|-
|Intel||Itanium 2||183.2
|-
|Sun||UltraSPARC IV||520.0
|}
 
В таблице приведены наихудшие результаты тестирования среди всех использованных компиляторов (gcc, icc, xlc) со всеми доступными флагами оптимизации. Исследователи утверждают, что различие среднего случая с худшим незначительно и не превышает десяти.
 
Поскольку в стандартных форматах (одинарной и двойной точности) денормализованные числа получаются действительно ''очень'' маленькими и практически никак не влияют на результат некоторых вычислений (при этом заметно замедляя их скорость), то иногда они просто игнорируются. При этом используются два простых механизма, получивших называние ''Flush-to-zero'' (''FTZ'') и ''Denormals-are-zero'' (''DAZ''). Первый механизм заставляет операции возвращать ноль, как только становится ясно, что результат будет денормализованным. Второй механизм заставляет операции рассматривать поступающие на вход денормализованные числа как нули. <br/>
Ярким примером подобного "отсечения" денормализованных чисел могут послужить видеокарты, в которых резкое падение скорости вычислений в сотню раз недопустимо. Так же, например, в областях, связанных с обработкой звука, нет нужды в очень маленьких числах, поскольку они представляют столь тихий звук, что его не способно воспринять человеческое ухо.
*[http://en.wikipedia.org/wiki/Floating_point Wikipedia - Floating point]
*[http://en.wikipedia.org/wiki/IEEE_754-2008 Wikipedia - IEEE 754-2008]
*[http://charm.cs.uiuc.edu/papers/SubnormalOSIHPA06.pdf Статья Isaac Dooley, Laxmikant Kale "Quantifying the Interference Caused by Subnormal Floating-Point Values"]
=== Что стоит прочесть ===
101
правка

Навигация