IEEE 754: обоснование формата: субнормальные и нормальные числа
Может кто-нибудь уточнить:
- Почему именно формат субнормальных чисел
±(0.F) × 2^-126
и нет±(1.F) × 2^-127
? - Почему именно формат нормальных чисел такой:
±(1.F) × 2^exp
а не, скажем,±(11.F) × 2^exp
, или, скажем,±(10.F) × 2^exp
?
2 ответа
Формат с плавающей запятой представляет числа, используя знак (- или +), показатель степени (целое число в некотором диапазоне от e min до e max включительно) и мантиссу, которая представляет собой число из p цифр в основании b , где b - это фиксированная база для формата, а p называется точностью. Мы будем рассматривать двоичный формат, в котором b равно двум.
Пусть цифры мантиссы равны f0 , f −1, f−2,… f1− p , так что мантисса равна сумме −p<i≤0 fi• b i , а представленное значение равно (−1) s • b e • sum −p<i≤0 fi• b i , где s - бит для знака, а e - показатель степени.
Если f0 равно нулю, мы можем опустить его из суммы, и представленное значение равно (−1) s • b e • sum −p<i≤−1 fi• b i = (−1) s • b e −1• сумма −p<i≤−1 fi• b i+1 = (−1) s • b e −1• сумма 1− p <i≤0 fi−1• b i. Следовательно, когда f0 равно нулю, а e не является eмин , есть два представления числа. Кодирование их обоих было бы расточительным, поэтому нам нужна схема кодирования, которая не кодирует оба представления.
Мы добиваемся этого:
- Некоторое значение E кодирует показатель степени e . Значения s и от f −1 до f 1− p хранятся непосредственно в виде битов.
- Если E равно нулю, e равно e min, а f0 равно нулю.
- Если E не равно нулю, e - это E - смещение, а f0 - это единица, где смещение равно 1 - e min .
- (Специальное значение E может быть зарезервировано для представления бесконечностей и NaN, здесь не обсуждается.)
Это представление и эта схема кодирования отвечают на вопросы:
Почему именно субнормальные числа имеют формат ±(0.F) × 2 - 126, а не ±(1.F) × 2 - 127?
Субнормальные числа в форме ±(1.F) × 2 −127 не будут включать ноль и будут включать числа, не входящие в представленные числа формата, так как они будут иметь числа с ненулевыми цифрами, меньшими, чем у младших ненулевых цифр. нулевая цифра в выбранном наборе. (Самая низкая цифра формы, описанной в первом абзаце, соответствует b e min +(1− p ) , тогда как числа в форме ±(1.F) × 2 −127 будут иметь младшую цифру, соответствующую b e min - 1+(1− п ).)
Почему именно формат нормальных чисел таков : ±(1.F) × 2 exp, а не, скажем, ±(11.F) × 2exp , или, скажем, ±(10.F) × 2exp?
Где десятичная точка (или «точка счисления») находится в значении, не имеет значения, пока она фиксирована. Представление, описанное с использованием десятичной точки сразу после первой цифры, как используется здесь, эквивалентно представлению с использованием десятичной точки после последней цифры или в любой другой позиции с подходящей корректировкой границ экспоненты: тот же набор чисел является Представленные и арифметические свойства идентичны. Итак, рассматривая разницу между 1.F и 11.F, нам все равно, где находится десятичная точка. Однако нас действительно волнует, сколько цифр представлено. Формат с плавающей запятой использует представление с фиксированным числом цифр. 11.F имеет на одну цифру больше, чем 1.F, и у нас нет причин кодировать это.
Что касается разницы между 11.F и 10.F, причина, по которой существует различие между нормальным и субнормальным, заключается в том, что арифметически существует два представления одного и того же числа, если первая цифра равна нулю, а показатель степени не является минимальным. Определение одной формы как нормальной позволяет нам устранить эти повторяющиеся представления. Однако 11.F и 10.F представляют собой разные числа, поэтому нет никаких дубликатов, которые нужно исключать, и нет причин говорить, что одно из них является нормальным, а другое - нет.
Я проверил свойства обоих форматов на упрощенном примере. Для простоты я использую форматы и, где
F
имеет 2 десятичные цифры и нет
±
.
Минимальные (ненулевые) / максимальные значения:
Format Min value (non-zero) Max value
0.F × 10^-2 0.01 × 10^-2 = 0.0001 0.99 × 10^-2 = 0.0099
1.F × 10^-3 1.00 × 10^-3 = 0.001 9.99 × 10^-3 = 0.00999
Вот графическое представление:
Здесь мы видим, что начиная со значения
0.001
формат больше не позволяет представлять меньшие значения. Однако формат позволяет представлять меньшие значения. Вот увеличенная версия:
Вывод: из графического представления мы видим, что свойства формата
0.F × 10^-2
по формату
1.F × 10^-3
находятся:
- дает больший динамический диапазон:
log10(max_real / min_real)
:1.99 vs 0.99
- дает меньшую точность: может быть представлено меньше значений:
100 vs 900
Похоже, что для субнормалов предпочтительнее IEEE 754.
more dynamic range
несмотря на
less precision
. Следовательно, формат субнормальных чисел таков:
±(0.F) × 2^-126
и нет
±(1.F) × 2^-127
.