Двоичное масштабирование - 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, где 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 .
Хотя операции с плавающей запятой в значительной степени преобладают там, где требуются скорость и дополнительная точность, двоичное масштабирование работает на более простом оборудовании и становится более точным, когда диапазон значений известен заранее и достаточно ограничен. Это связано с тем, что все биты в двоичном масштабированном целом числе используются для точности значения (хотя могут быть ведущие нули, если диапазон значений большой), тогда как в плавающей запятой некоторые биты используются для определения масштабирования.
Смотрите также
- Libfixmath - библиотека, написанная на C для математики с фиксированной точкой
- Q (числовой формат)
- Minifloat
- Блокировать масштабирование с плавающей запятой
- Операция по модулю