WikiDer > Двоичное масштабирование - Википедия
Эта статья нужны дополнительные цитаты для проверка. (Декабрь 2009 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
Двоичное масштабирование это компьютерное программирование техника, обычно используемая во встроенных C, DSP и ассемблер программы для реализации нецелочисленных операций с использованием собственного целое число арифметика процессора.
Обзор
Представление значения с использованием двоичного масштабирования более точное, чем представление с плавающей запятой, занимающее такое же количество бит, но обычно представляет значения более ограниченного диапазона, поэтому легче приводит к арифметическое переполнение во время расчета. Реализация операций с использованием целочисленных арифметических инструкций часто (но не всегда) быстрее, чем соответствующие инструкции с плавающей запятой.
Положение «двоичной точки» выбирается для каждой представляемой переменной, и соответственно корректируются двоичные сдвиги, связанные с арифметическими операциями. Двоичное масштабирование соответствует в Q (числовой формат) до первой цифры, то есть Q1.15 - это 16-битное целое число, масштабируемое с одним битом как целым числом и пятнадцатью как дробным. Число Bscal 1 или Q1.15 будет представлять приблизительно от 1,999 до -2,0.
Чтобы привести пример, распространенный способ использования целочисленная арифметика для имитации чисел с плавающей точкой с использованием 32-битных чисел необходимо умножить коэффициенты на 65536.
С помощью двоичная научная запись, это поместит двоичную точку в B16. То есть 16 старших разрядов представляют собой целую часть, а остаток - дробную часть. Это означает, что целое число B16 с дополнением до двух со знаком может содержать наивысшее значение и самое низкое значение -32768,0. Другими словами, число B - это количество целых битов, используемых для представления числа, определяющего диапазон его значений. Остальные младшие биты (то есть нецелочисленные биты) используются для хранения дробных величин и обеспечения большей точности.
Например, чтобы представить 1,2 и 5,6 как B16, их умножают на 2.16, давая 78643 и 367001 как ближайшие целые числа.
Их умножение дает
28862059643
Чтобы преобразовать его обратно в B16, разделите его на 216.
Это дает 440400B16, которое при обратном преобразовании в число с плавающей запятой (путем повторного деления на 216, но результат с плавающей запятой) дает приблизительно 6,71997. Правильный результат - 6,72.
Масштабирование после умножения
Приведенный выше пример умножения B16 является упрощенным примером. Изменение масштаба зависит как от значения шкалы B, так и от размера слова. B16 часто используется в 32-битных системах, потому что он работает просто путем умножения и деления на 65536 (или сдвига 16 бит).
Рассмотрим двоичную точку в 32-битном слове со знаком следующим образом:
0 1 2 3 4 5 6 7 8 9 S Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х Х
где 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 равно 1,4 * (2 ^ (размер слова-2-1)) == 1,4 * 2 ^ 29 == 0x2CCCCCCD
Обратите внимание, что здесь значения 1,4 очень хорошо представлены 30 дробными битами. 32 бит число с плавающей запятой имеет 23 бита для хранения дроби. Вот почему масштабирование B всегда более точное, чем с плавающей запятой того же размера слова. Это особенно полезно в интеграторы или повторное суммирование малых величин, где ошибка округления может быть тонкой, но очень опасной проблемой при использовании чисел с плавающей запятой.
Теперь большее число 15,2 на B4.
15,2 @ B4 равно 15,2 * (2 ^ (размер слова-4-1)) == 15,2 * 2 ^ 27 == 0x7999999A
Количество бит для хранения дроби составляет 28 бит. Умножение этих 32-битных чисел дает 64-битный результат. 0x1547AE14A51EB852
Этот результат находится в B7 в виде 64-битного слова. Сдвиг вниз на 32 бита дает результат в формате B7 в 32 бита.
0x1547AE14
Чтобы преобразовать обратно в число с плавающей запятой, разделите это на (2 ^ (размер слова-7-1)) == 21.2800000099
Могут использоваться различные масштабирования. Например, B0 может использоваться для представления любого числа от -1 до 0,999999999.
Бинарные углы
Двоичные углы отображаются с помощью B0, где 0 как 0 градусов, 0,5 как 90 ° (или ), -1,0 или 0,9999999 как 180 ° (или π), и −0,5 как 270 ° (или ). Когда эти двоичные углы складываются с использованием обычных два дополнения математика, поворот углов правильный, даже при пересечении границы знака; это удобно устраняет необходимость проверки углов ≥ 360 ° при работе с обычными углами[1] (данные, которые допускают углы с более чем одним вращением, должны использовать другую кодировку).
Условия двоичное угловое измерение (БАМ)[2] и бинарная система измерения углов (БАМС)[3] а также штифты (двоичные радианы или же двоичная степень) относятся к реализациям двоичных углов. Они находят применение в робототехнике, навигации,[4] компьютерные игры,[5] и цифровые датчики.[6]
Независимо от того, какой битовый шаблон хранится в двоичном угле, когда он умножается на 180 ° (или π) с использованием стандартных подписанных арифметика с фиксированной точкой, результатом всегда будет допустимый угол в диапазоне -180градусы (−π радианы) до +180 градусов (+ π В некоторых случаях удобно использовать умножение без знака (вместо умножения со знаком) на двоичный угол, который дает правильный угол в диапазоне от 0 до +360 градусов (+ 2π радианы или +1 повернутьПо сравнению с хранением углов в двоичном формате углов, сохранение углов в любом другом формате неизбежно приводит к тому, что некоторые битовые шаблоны дают «углы» за пределами этого диапазона, что требует дополнительных шагов для сокращение диапазона значение в желаемый диапазон или приводит к некоторым битовым шаблонам, которые вообще не являются допустимыми углами (NaN), или оба.
Применение методов двоичного масштабирования
Методы двоичного масштабирования использовались в 1970-х и 1980-х годах для вычислений в реальном времени, которые были математически интенсивными, например моделирование полета И в Атомная электростанция алгоритмы управления с конца 1960-х гг. Код часто комментировался двоичными вычислениями промежуточных результатов уравнений.
Двоичное масштабирование все еще используется во многих DSP приложения и микропроцессоры, изготовленные на заказ, обычно основаны на методах двоичного масштабирования. Двоичное угловое измерение используется в STM32G4 серия встроена КОРДИК сопроцессоры.
Двоичное масштабирование в настоящее время используется в DCT используется для сжатия JPEG изображения в утилитах, таких как GIMP.
Хотя операции с плавающей запятой в значительной степени преобладают, когда требуются скорость и дополнительная точность, двоичное масштабирование работает на более простом оборудовании и становится более точным, когда диапазон значений известен заранее и достаточно ограничен. Это связано с тем, что все биты двоичного масштабированного целого числа используются для точности значения (хотя могут быть ведущие нули, если диапазон значений большой), тогда как в плавающей запятой некоторые биты используются для определения масштабирования.
Смотрите также
- Libfixmath - библиотека, написанная на C для математики с фиксированной точкой
- Q (числовой формат)
- Minifloat
- Блокировать масштабирование с плавающей запятой
- Операция по модулю
Рекомендации
- ^ Харгривз, Шон. «Углы, целые числа и арифметика по модулю». blogs.msdn.com. В архиве из оригинала на 2019-06-30. Получено 2019-08-05.
- ^ «Двоичное угловое измерение». Архивировано из оригинал 21 декабря 2009 г.
- ^ «Двоичная система измерения углов». акронимы..
- ^ ЛаПланте, Филипп А. (2004). «Глава 7.5.3, Двоичная угловая мера». Проектирование и анализ систем реального времени. www.globalspec.com.
- ^ Санглард, Фабьен (13 января 2010). «Обзор кода Doom 1993 - Раздел« Стены »"". fabiensanglard.net.
- ^ "Модуль компаса Hitachi HM55B (# 29123)" (PDF). www.hobbyengineering.com. Цифровой датчик компаса Parallax (# 29123). Parallax, Inc. Май 2005. Архивировано с оригинал (PDF) 11.07.2011 - через www.parallax.com.