Часто мы используем микроконтроллеры, чтобы делать что-то в наших роботах, но нужно сделать некоторые вычисления в десятичном виде. Использование переменных с плавающей запятой очень медленное, потому что автоматически включается программная библиотека с плавающей запятой (если у вас нет высокопроизводительного микроконтроллера). Поэтому мы обычно используем арифметику с фиксированной точкой.
Всякий раз, когда я делаю это, я просто использую целое число и помню, где находится десятичное число. Однако необходимо позаботиться о том, чтобы все было согласованно, особенно когда в расчетах используются переменные, в которых десятичная точка находится в другом месте.
Я реализовал функцию atan2 с фиксированной точкой, но, поскольку я пытался сжать каждую последнюю каплю с ограниченной точностью (16 бит), я часто менял определение определения десятичной точки, и она менялась при настройке. Кроме того, у меня были бы некоторые константы, такие как квази-справочная таблица, у которых где-то есть подразумеваемая десятичная точка.
Я хочу знать, есть ли лучший способ. Существует ли библиотека или набор макросов, которые могут упростить использование переменных с фиксированной запятой, упростить умножение и деление между смешанными переменными и разрешить объявление десятичных чисел или константных выражений, но автоматически конвертировать в требуемое представление с фиксированной запятой при компиляции время?
источник
Ответы:
Было бы неплохо, если бы мы могли сообщить компилятору диапазон и точность каждой входной переменной с фиксированной точкой (возможно, нет двух, имеющих основную точку в одном и том же месте), и она бы автоматически - во время компиляции - использовала правильный диапазон точность и масштабирование операций для промежуточных и конечных значений в серии вычислений. До меня дошли слухи, что это возможно сделать на языке программирования Ada или в шаблонах C ++.
Увы, самое близкое, что я видел, - это арифметические библиотеки с фиксированной точкой, которые требуют, чтобы вы, программист, вручную выбирали правильное представление и вручную проверяли, что каждая операция поддерживает достаточный диапазон и точность. Иногда они облегчают умножение и деление смешанных переменных. Такие как:
источник
Я использовал библиотеку TI IQMath для реализации виртуальных операций с плавающей запятой на их DSP с фиксированной запятой.
Это использует некоторые специфичные для TI вещи, но я также использовал этот код в качестве основы для реализации виртуальной математики с плавающей точкой на других микроконтроллерах. Для переноса требуется немного работы, но это намного проще, чем начинать с нуля.
источник
Существует ряд реализаций (нет библиотек, о которых я сразу узнаю) Binary Scaling (иначе B-scaling)
При этом вы сохраняете мысленную заметку (или, что еще лучше, документируете код ...), где находится десятичная точка, используя сдвиги для перемещения десятичной точки вверх или вниз.
Я использовал B-scaling в ассемблере для оборонных проектов, даже на самых маленьких процессорах, поэтому могу поручиться за его пригодность для всего остального ...
источник
Если вы используете целое число, чтобы помнить, где находится «точка», они как бы используют арифметику с плавающей запятой. Фиксированная точка, действительно имеет фиксированную точку.
atan
cos
Это зависит от диапазона значений, в котором нуждается ваше приложение, но вы можете полностью перейти к представлению с фиксированной точкой. То есть, например, вместо того, чтобы хранить число вроде этого:
где
number
целое число иdecimal_point
говорит, где находится десятичная точка, вы можете сохранить его следующим образом:где целое число
integer.fraction
, которое имеет то же использование памяти, более высокий диапазон значений и, как правило, проще в использовании.источник
#define
, верно? Я думал, что вы на самом деле храните его, и оно может варьироваться в зависимости от того, насколько велико или мало ваше число.