Почему представление с плавающей запятой использует знаковый бит вместо дополнения 2 для обозначения отрицательных чисел

20

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

Кроме того, почему биты экспоненты используют смещение вместо представления величины со знаком (аналогично битам мантиссы) или представления дополнения 2?

Обновление: Извините, если я не дал понять, Я искал причину того, как формируется представление с плавающей точкой. Если между альтернативами нет сильного компромисса в реализации, то может ли кто-нибудь объяснить исторические аспекты представления с плавающей запятой?

Koo
источник

Ответы:

7

Дополнение Two имеет смысл, когда две рассматриваемые сущности имеют одинаковые «единицы» и одинаковую «ширину». Под шириной я подразумеваю, что, скажем, если вы добавляете N-битное число и M-битное число, где N и M разные, то лучше не использовать дополнение к двум. Для чисел с плавающей запятой у нас есть проблема единиц: если показатели отличаются, то мы мысленно сдвигаем одну из мантисс, и теперь у нас та же проблема, что и раньше (с шириной).

Что касается битов экспоненты, используя смещение вместо знака + величины, мы получаем еще одно значение (в противном случае мы получили бы +0 и -0). Здесь два-дополнение имеет смысл при умножении или делении чисел (с тех пор мы добавляем или вычитаем показатели), но не так много смысла при сложении или вычитании.

Редактировать: комментатор отметил, что вы можете добавить два целых числа дополнения разной длины, используя расширение знака. Существует также некоторая проблема с обнаружением переполнения, но это также можно исправить. Таким образом, вы можете использовать два дополнения, если вы достаточно осторожны. (Вам также нужно обрабатывать умножение и деление.)

Юваль Фильмус
источник
4
«Если вы добавляете номер N-бита и номер M-бита, где N и M разные, то вам лучше не использовать дополнение двух» - не могли бы вы уточнить немного? Я полагаю, что вполне возможно подписать расширение числа, используя представление дополнения 2, используя его MSB, например, 4'b1111 будет расширяться до 5'b11111, а 4'b0111 -> 5'b00111. Разве это не должно быть просто добавить это к существующему модулю барреля в арифметической логике с плавающей запятой?
koo
Спасибо за ваш ответ! Я отредактировал вопрос, чтобы он более четко спросил о том, что делает текущую плавающую точку.
Ку
4

Из Википедии:

Преимущество системы с двумя дополнениями состоит в том, что основные арифметические операции сложения, вычитания и умножения идентичны операциям для двоичных чисел без знака ...

Двойка-дополнение представляет собой представление отрицательных чисел, что очень удобно. Вот и вся причина использовать его вообще.

Пара мантисса-экспонента является представлением числа с плавающей запятой. Большую часть времени при использовании чисел с плавающей запятой вы не делаете арифметику исключительно на мантиссе или исключительно на экспоненте.

каче
источник
4

Но почему знаковый бит необходим для чисел с плавающей запятой

Ложное предположение. Это не обязательно. Я почти уверен, что встречал форматы с плавающей запятой, которые использовали дополнение 2 для мантиссы, но мне пришлось бы искать имена.

Я далеко не специалист по численному анализу, но я понимаю, что для них важно иметь нулевой знак. Вероятно, легче манипулировать, чем дополнять. Это было, вероятно, критерием при выборе IEEE-754.

Кроме того, почему биты экспоненты используют смещение вместо представления величины со знаком

Опять же это что-то не нужно, и некоторые поступили иначе.

Это представление, для которого проще сделать аппаратную реализацию для набора операций, выполняемых над показателями (и здесь наличие представления для -0 не требуется).

Одним из следствий этого выбора является то, что вы можете использовать целочисленное сравнение со знаком для сравнения числа FP, если вы не заботитесь о NaN, что, возможно, было критерием для некоторых (тот факт, что NaN требует специальной обработки, заставляет меня сомневаться, что это не так. для IEEE-754).

AProgrammer
источник
Целочисленные сравнения со знаком будут ранжировать отрицательные числа FP в обратном направлении. Для того, чтобы они могли правильно ранжироваться, был бы необходим какой-то формат дополнения, причем дополнение, вероятно, было бы лучшим (отрицательное было бы ... 110.1111 ..., с бесконечными слева и справа).
суперкат
3
MIL-STD-1750A , вероятно, является наиболее широко используемой процессорной архитектурой, которая задает двоичное представление с плавающей запятой. В разделе 4.1: «Набор команд должен поддерживать 16-битные данные с фиксированной запятой одинарной точности, 32-битной фиксированной запятой двойной точности, 32-битной плавающей запятой и 48-битной расширенной точностью с плавающей запятой в представлении дополнения 2». (Выделено) ,
njuffa
2

IEEE 754 использует знак / величину, а не два или одно дополнение.

Недостатком дополнения к двум является то, что положительный и отрицательный диапазон не идентичны. Если все битовые комбинации верны, то у вас есть числа x, где вы не можете легко вычислить -x. Плохо. Альтернатива состоит в том, что существуют недопустимые битовые комбинации, что тоже плохо. В IEEE 754 нет недопустимых битовых комбинаций для 64- или 32-битных чисел с плавающей запятой, поэтому вам не нужно об этом беспокоиться.

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

gnasher729
источник
Первый абзац этого ответа предполагает, что нет никаких недостатков для знака / величины. Знак / величина имеет +/- 0 и более сложную арифметику, чем дополнение к двум.
праксеолит
Наличие +/- нуля - это и проблема, и особенность. Например, деление крошечного числа x на 10 ^ 100 даст +0 или -0, сохранив знак x.
gnasher729
1

Подписанные нули дают повышенную выразительность, которая может быть полезна при численных вычислениях. На странице википедии « Подписанный ноль » написано:

Утверждается, что включение нуля со знаком в IEEE 754 значительно облегчает достижение численной точности в некоторых критических задачах , в частности при вычислениях со сложными элементарными функциями .

WH Kahan, один из главных разработчиков IEEE 754 с плавающей точкой, является сторонником нулевого знака по этим причинам. Его мнение, вероятно, имело большой вес.

equaeghe
источник
1

Я думаю, что важно понимать, что вычисления с плавающей точкой дают приблизительные значения, а не точные значения. То есть, если вычисление с плавающей точкой дает закодированное значение X, то это представляет теоретически идеальное значение, которое почти наверняка НЕ ​​X, но находится в диапазоне [X .. X + e) ​​{где 'e' является ' machine epsilon ', то есть между X и X + e нет числа с плавающей точкой. Более конкретно, ноль с плавающей точкой представляет идеальное число, которое, вероятно, не является точно нулем, но слишком мало, чтобы представлять его с ненулевым значением, закодированным с плавающей точкой.

Учитывая, что использование знака и величины является способом, позволяющим кодированию «запоминать», на какой стороне нуля находится идеальное значение, положительное или отрицательное. Это важно в некоторых сложных (в смысле «a + bi») вычислениях - сложные-> сложные функции часто являются «многозначными», поэтому для правильного вычисления важно обращать внимание на места «срезов ветвей». Подписанные нули затем в некотором смысле обозначают места этих срезов ветвей - расчет, выполненный на положительной стороне, будет отличаться от расчета на отрицательной стороне.

PMar
источник
1
Вычисления с плавающей точкой дают точные значения. Они просто немного отличаются от значений, которые производят математические действительные числа. Число с плавающей запятой представляет собой одно число, а не диапазон.
gnasher729
0

Большинство форматов с плавающей запятой используют тот факт, что в двоичной системе любое ненулевое значение с ненулевым показателем будет иметь «1» в качестве наиболее значимого бита мантиссы. Таким образом, в системе с 23-битным полем для мантиссы мантиссы положительных чисел варьируются не от 0 до 8 388 607, а от 8 388 608 до 16 777 215. Мантиссы чисел, которые могут быть или не быть положительными, находятся в диапазоне от -16 777 215 до -8 388 608 и от + 8 388 608 до + 16 777 215. В то время как два дополняют два - лучший числовой формат, когда необходимо, чтобы расчеты «плавно» пересекали ноль, разрывные диапазоны значений мантиссы означают, что вычисления не смогут работать плавно по нулю, независимо от того, используют ли они дополняющие два или что-то еще. ,

Supercat
источник