Двоичное масштабирование - Binary scaling

Двоичное масштабирование - это метод компьютерного программирования , обычно используемый во встроенных программах C , DSP и ассемблере для реализации нецелочисленных операций с использованием собственной целочисленной арифметики процессора.

Обзор

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

Положение «двоичной точки» выбирается для каждой представляемой переменной, и соответственно корректируются двоичные сдвиги, связанные с арифметическими операциями. Двоичное масштабирование соответствует в Q (числовой формат) первой цифре, т. Е. Q1.15 - это 16-битное целое число, масштабируемое с одним битом как целым числом и пятнадцатью как дробным. Число Bscal 1 или Q1.15 будет представлять приблизительно от 0,999 до -1,0.

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

Используя двоичную научную нотацию , это поместит двоичную точку в B16. То есть 16 старших разрядов представляют собой целую часть, а остаток - дробную часть. Это означает, что как знаковое целое число с дополнением до двух, число B16 может содержать наивысшее значение и наименьшее значение -32768,0. Другими словами, число B - это количество целых битов, используемых для представления числа, определяющего диапазон его значений. Оставшиеся младшие биты (то есть нецелочисленные биты) используются для хранения дробных величин и обеспечения большей точности.

Например, чтобы представить 1,2 и 5,6 как B16, их умножают на 2 16 , получая 78643 и 367001 как ближайшие целые числа.

Их умножение дает

28862059643

Чтобы преобразовать его обратно в B16, разделите его на 2 16 .

Это дает 440400B16, что при обратном преобразовании в число с плавающей запятой (путем повторного деления на 2 16 , но с сохранением результата как с плавающей запятой) дает приблизительно 6,71997. Правильный результат - 6,72.

Масштабирование после умножения

Приведенный выше пример умножения B16 является упрощенным примером. Изменение масштаба зависит как от значения шкалы B, так и от размера слова. B16 часто используется в 32-битных системах, потому что он работает просто путем умножения и деления на 65536 (или сдвига 16 бит).

Рассмотрим двоичную точку в 32-битном слове со знаком следующим образом:

0 1 2 3 4 5 6 7 8 9
 S X X X X X X X   X X X X X X X X   X X X X X X X X   X X X X X X X X

где S - знаковый бит, а X - другие биты.

Размещение двоичной точки в

  • 0 дает диапазон от -1,0 до 0,999999.
  • 1 дает диапазон от -2,0 до 1,999999
  • 2 дает диапазон от -4,0 до 3,999999 и так далее.

При использовании различных масштабов B и / или размеров слов необходимо использовать полную формулу преобразования масштабирования B.

Рассмотрим 32-битный размер слова и две переменные, одна с масштабированием B, равным 2, а другая с масштабированием, равным 4.

1.4 @ B2 is 1.4 * (2 ^ (wordsize-2-1)) == 1.4 * 2 ^ 29 == 0x2CCCCCCD

Обратите внимание, что здесь значения 1,4 очень хорошо представлены 30 дробными битами. 32-битное число с плавающей запятой имеет 23 бита для хранения дроби. Вот почему масштабирование B всегда более точное, чем с плавающей запятой того же размера слова. Это особенно полезно в интеграторах или при повторном суммировании небольших величин, где ошибка округления может быть незначительной, но очень опасной проблемой при использовании чисел с плавающей запятой.

Теперь большее число 15,2 на B4.

15.2 @ B4 is 15.2 * (2 ^ (wordsize-4-1)) == 15.2 * 2 ^ 27 == 0x7999999A

Количество бит для хранения дроби составляет 28 бит. Умножение этих 32-битных чисел дает 64-битный результат 0x1547AE14A51EB852

Этот результат находится в B7 в виде 64-битного слова. Сдвиг вниз на 32 бита дает результат в формате B7 в 32 бита.

0x1547AE14

Чтобы преобразовать обратно в число с плавающей запятой, разделите это на (2^(wordsize-7-1)) == 21.2800000099

Могут использоваться различные масштабирования. Например, B0 можно использовать для представления любого числа от -1 до 0,999999999.

Бинарные углы

Представление углов в двоичном масштабе (B0). Черный - это традиционное представление градусов, зеленый - это десятичное число BAM, а красный - шестнадцатеричное 32-битное представление BAM.

Двоичные углы отображаются с помощью B0, где 0 - 0 градусов, 0,5 - 90 ° (или ), -1,0 или 0,9999999 - 180 ° (или π рад) и -0,5 - 270 ° (или ). Когда эти двоичные углы складываются с использованием обычной математики с дополнением до двух , вращение углов является правильным, даже при пересечении границы знака; это удобно избавляет от проверки углов ≥ 360 ° при обработке обычных углов (данные, которые допускают углы с более чем одним поворотом, должны использовать другую кодировку).

Термины двоичное угловое измерение ( BAM ) и двоичная угловая система измерения ( BAMS ), а также скобки ( двоичные радианы или двоичные градусы ) относятся к реализациям двоичных углов. Они находят применение в робототехнике, навигации, компьютерных играх и цифровых датчиках.

Независимо от того, какой битовый шаблон хранится в двоичном угле, когда он умножается на 180 ° (или π рад) с использованием стандартной арифметики с фиксированной точкой со знаком , результатом всегда является допустимый угол в диапазоне -180  градусов (  радиан ) до +180 градусов ( + π  радиан). В некоторых случаях удобно использовать умножение без знака (вместо умножения со знаком) на двоичный угол, который дает правильный угол в диапазоне от 0 до +360 градусов ( + 2π  радиан или +1 оборот ). По сравнению с хранением углов в двоичном формате углов, сохранение углов в любом другом формате неизбежно приводит к некоторым битовым шаблонам, дающим «углы» за пределами этого диапазона, что требует дополнительных шагов для уменьшения диапазона значений до желаемого диапазона или приводит к некоторым битовым шаблонам. которые не являются допустимыми углами вообще ( NaN ) или и тем, и другим.

Применение методов двоичного масштабирования

Методы двоичного масштабирования использовались в 1970-х и 1980-х годах для вычислений в реальном времени, которые были математически интенсивными, таких как моделирование полета и алгоритмы управления АЭС с конца 1960-х годов. Код часто комментировался двоичным масштабированием промежуточных результатов уравнений.

Двоичное масштабирование по-прежнему используется во многих приложениях DSP, а микропроцессоры, изготовленные на заказ, обычно основаны на методах двоичного масштабирования. Двоичное угловое измерение используется в серии STM32G4, встроенной в сопроцессоры CORDIC .

Двоичное масштабирование в настоящее время используется в DCT, используемом для сжатия изображений JPEG в таких утилитах, как GIMP .

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

Смотрите также

Рекомендации