Отрицательное представление числа с фиксированной точкой - PullRequest
0 голосов
/ 31 марта 2020

Я пишу стандартную c подпрограмму для преобразования чисел с фиксированной запятой между десятичными и двоичными представлениями.

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

Кто-нибудь скажет мне, какой источник является правильным или существует ли стандартное представление для чисел со знаком с фиксированной точкой?

Кроме того, если представление дополнения 2 было правильным, то как представить отрицательные числа с нулевым целым числом? часть. Например -0.125?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Легче всего думать о числах с фиксированной точкой как с масштабированием целых чисел, а не смещенных целых чисел. Для данного типа с фиксированной запятой существует фиксированная шкала , которая является степенью двойки (или десяти). Чтобы преобразовать действительное значение в целочисленное представление, умножьте его на этот масштаб. Чтобы преобразовать обратно, просто разделите. Тогда вопрос о том, как представлены отрицательные значения, становится подробностью целочисленного типа, с которым вы представляете свое число.

Пожалуйста, кто-нибудь скажет мне, какой источник является правильным ...

И то и другое проблемно c.

Ваш первый источник неверен. Данный пример не ...

такой же, как числа дополнения 2.

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

Ваш второй источник может быть немного вводящим в заблуждение, когда он говорит ...

сдвигая битовую комбинацию числа вправо на 1 бит, всегда делим число на 2.

Этот оператор затрагивает проблему недостаточного значения, которое возникает, когда LSB (младший значащий бит) устанавливается в 1, а результирующее округление. Сдвиг вправо обычно приводит к округлению до отрицательной бесконечности, тогда как деление приводит к округлению до нуля (усечение). Оба производят одинаковое поведение для положительных чисел: 3/2 == 1 и 3>>1 == 1. Для отрицательных чисел они противоположны: -3/2 == -1, но -3>>1 == -2.

... есть ли стандартное представление для чисел со знаком с фиксированной точкой ?

Я так не думаю. Существуют языковые стандарты c, например, ISO / IEC TR 18037 ( черновик ). Но соглашение о масштабировании целых чисел для аппроксимации действительных чисел заданного диапазона и разрешения хорошо известно. Как представлены базовые целые числа, это другой вопрос.

Кроме того, если представление дополнения 2 было правильным, то как представлять отрицательные числа с нулевой целой частью. Например -0,125?

Это зависит от формата вашего целого числа и вашего выбора radix. Предполагая 16-разрядное число с двумя дополнительными числами, представляющее двоичные значения с фиксированной запятой, масштабный коэффициент равен 2^15, что составляет 32,768. Умножьте значение для хранения как целое число: -0.125*32768. == -4096 и разделите, чтобы получить его: -4096/32768. == -0.125.

1 голос
/ 31 марта 2020

Числа с фиксированной точкой - это просто двоичные значения, в которых значения места были изменены. Присвоение значений битам является произвольной человеческой деятельностью, и мы можем сделать это любым удобным для вас способом. Обычно мы говорим о двоичных целых числах , поэтому удобно назначить значение места 2 ^ 0 = 1 для младшего бита, 2 ^ 1 = 2 для бита слева от младшего бита и так далее. Для целого числа N битов значение MSB становится равным 2 ^ (N-1). Если нам нужно представление с дополнением до двух, мы меняем значение места старшего разряда на -2 ^ (N-1), а все остальные значения разрядов битов остаются неизменными.

Для значений с фиксированной точкой, если мы хотим, чтобы F бит представляли дробную часть числа, тогда значение места младшего разряда становится 2 ^ (0-F), а значение места старшего разряда становится 2 ^ (N-1-F) для чисел без знака и - 2 ^ (N-1-F) для чисел со знаком.

Итак, как бы мы представили -0,125 в значении с фиксированной точкой, дополняющем два? Это равно 0,875 - 1, поэтому мы можем использовать представление, в котором значение места старшего бита равно -1, а значение всех остальных битов составляет 0,875. Если вы выберете 4-битное число с фиксированной запятой с 3-мя дробными битами, вы скажете, что двоичное число 1111 равно -0,125 десятичного. Сложив значения мест битов, мы получим (-1) + 0,5 + 0,25 + 0,125 = -0,125. Мое личное предпочтение - записать двоичное число как 1.111, чтобы отметить, какие биты являются дробными, а какие целыми.

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

...