The IEEE 754-2008 Стандарт включает форматы десятичных чисел с плавающей запятой, в которых значащее и экспонента (и полезные данные NaN ) могут быть закодированы двумя способами, называемыми двоичным кодированием и десятичное кодирование.
Оба формата разбивают число на знаковый бит s, показатель степени q (между q min и q max) и p-значная величина c (от 0 до 10-1). Закодированное значение - (-1) × 10 × c. В обоих форматах диапазон возможных значений идентичен, но они различаются способом представления значения c. В десятичном кодировании он кодируется как последовательность из p десятичных цифр (с использованием кодирования плотно упакованных десятичных чисел (DPD)). Это делает преобразование в десятичную форму эффективным, но для обработки требуется специальный десятичный ALU. В кодировке двоичное целое десятичное число (BID ) оно кодируется как двоичное число.
Используя тот факт, что 2 = 1024 лишь немного больше, чем 10 = 1000, 3n-значные десятичные числа могут быть эффективно упакованы в 10n двоичных битов. Однако форматы IEEE имеют значения из 3n + 1 цифр, для представления которых обычно требуется 10n + 4 двоичных разряда.
Это было бы неэффективно, потому что необходимы только 10 из 16 возможных значений дополнительных 4 бит. Более эффективное кодирование может быть разработано с использованием того факта, что диапазон экспоненты имеет форму 3 × 2, поэтому показатель степени никогда не начинается с 11
. Используя кодировку Decimal32 (с мантиссой 3 * 2 + 1 десятичных цифр) в качестве примера (e
обозначает показатель степени, m
обозначает мантиссу, т.е. мантиссу):
0ммм
, при отсутствии ведущего 0-го бита мантисса умещается в 23 бита:s 00eeeeee (0) mmm mmmmmmmmmm mmmmmmmmmm s 01eeeeee (0) mmm mmmmmmmmmm mmmmmmmmmm s 10eeeeee (0) mmm мммммммммм мммммммммм
100m
, пропуск первых 100 битов позволяет мантиссе уместиться в 21 бит. Показатель экспоненты сдвигается на 2 бита, и пара 11
битов показывает, что используется эта форма:s 1100eeeeee (100) m мммммммммм мммммммммм s 1101eeeeee (100) m мммммммммм мммммммммм s 1110eeeeee (100) m мммммммммм мммммммммм
s 1111
:s 11110 xxxxxxxxxxxxxxxxxxxxxxxxxx s 111110 xxxxxxxxxxxxxxxxxxxxxxxxx s 111110 xxxxxxxxxxxxxxxxxxxxxxx s 111111 xxxxxxxxxxx в круглых скобках неявны: они не включены в 32 бита кодировки Decimal32, но подразумеваются двумя битами после бита знака.Кодировки Decimal64 и Decimal128 имеют большие поля экспоненты и значимости, но работают аналогичным образом.
Для кодирования Decimal128 113 битов значения фактически достаточно для кодирования 34 десятичных цифр, а вторая форма фактически никогда не требуется.
КогортаДесятичное число с плавающей запятой может быть закодировано несколькими способами, разные способы представляют разную точность, например 100,0 кодируется как 1000 × 10, а 100,00 кодируется как 10000 × 10. Набор возможных кодировок одного и того же числового значения в стандарте называется когортой. Если результат вычисления неточен, наибольший объем значимых данных сохраняется путем выбора члена когорты с наибольшим целым числом, которое может быть сохранено в мантиссе вместе с требуемой экспонентой.
ДиапазонПредлагаемый стандарт IEEE 754r ограничивает диапазон чисел мантиссой формы 10-1, где n - количество целых десятичных цифр, которые могут быть сохранены в доступных битах. чтобы десятичное округление выполнялось правильно.
32 бита | 64 бита | 128 бит | |
---|---|---|---|
биты памяти | 32 | 64 | 128 |
Конечные значащие биты | 20 | 50 | 110 |
значащие биты | 23/24 | 53/54 | 113 |
Знаки и цифры | 7 | 16 | 34 |
Комбинированные биты | 11 | 13 | 17 |
Экспонент биты | 8 | 10 | 14 |
Смещение | 101 | 398 | 6176 |
Стандартный emax | 96 | 384 | 6144 |
Стандартный emin | −95 | −383 | −6143 |
Двоичное кодирование по своей сути менее эффективно для преобразований в данные с десятичной кодировкой или из них, таких как строки (ASCII, Unicode и т. Д.) И BCD. Поэтому двоичное кодирование лучше всего выбирать, только когда данные являются двоичными, а не десятичными. IBM опубликовала некоторые непроверенные данные о производительности.