DIY FP - Реализация математики с плавающей запятой на микроконтроллере без аппаратного FPU


8

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

Микроконтроллер, с которым я работаю, не имеет встроенной плавающей запятой или стандартной библиотеки с плавающей запятой.

Существуют ли хорошие ресурсы или учебные пособия по реализации математических программ с плавающей запятой? Желательно на действительно ограниченных ресурсах (у меня даже нет стека!).


Я хотел бы поддержать doubleразмерные поплавки. Пропеллер представляет собой 32-битный MCU, поэтому мне придется использовать несколько переменных для каждого числа с плавающей запятой.

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

Нет, мне, наверное, не нужны doubleпоплавки, но это звучит как очень интересный проект. Половина причины, по которой я хочу это сделать, заключается в том, что я многому научусь по пути.


какой компилятор? Возможно, я пропустил это, но я не вижу, какой язык вы используете.
Кортук

@Kortuk - я лично нацеливаюсь на пропеллер Parallax, так что это будет либо Spin, либо asm. Тем не менее, я думаю, что это не должно быть слишком специфичным для языка. Предположим, у меня есть общие операции (+ - / * битовое смещение, битовое и / или / и т.д ..).
Коннор Вольф

Какие операции нужно выполнить? Если вы просто хотите сложить, вычесть и умножить, и вас не слишком волнуют крайние случаи, NaN и т. Д., То реализовать это будет довольно тривиально. В прошлом я делал это для 8-битных микроконтроллеров, и это не гигантская задача, даже если вы делаете все это в asm.
Пол Р

1
Ну, как вы говорите, вы узнаете много нового о реализации операций с плавающей точкой.
Пол Р

3
Может быть, вам не нужно с плавающей точкой. Если вам просто нужны дробные числа, можно использовать арифметику с фиксированной запятой и смещенной десятичной (фактической двоичной) точкой в ​​некоторых местах влево. Можете ли вы рассказать больше о вашем приложении?
Творог

Ответы:


4

Если вы хотите сделать это самостоятельно, я бы сказал, просто сделай это.

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

Вот схема:

  • добавление / вычитание:
    если показатели отличаются слишком сильно (больше, чем у мантиссы биты):
    просто верните значение с большим показателем (если это вычитаемое значение: отрицание)

    если показатели одинаковы:
    сдвиньте мантиссу меньшего значения на разность показателей и прибавьте / вычтите из другой мантиссы (используя арифметику с фиксированной запятой),
    если результат не равен 0: сдвиньте мантиссу до MSBit результата, равного 1, и уменьшите показатель степени на ту же величину

  • умножение / деление:
    умножение / деление мантисс (с использованием арифметики с фиксированной точкой) и сложение / вычитание показателей


2

Вы должны быть в состоянии использовать эту библиотеку с плавающей точкой с множественной точностью на Propeller с Catalina C или gcc. Однако это может быть слишком медленно для многих приложений.


Может ли код C на винте взаимодействовать с Spin или prop-asm? Если нет, я мог бы попробовать перевести его на спин. К счастью, мне не нужно много скорости. Реально мне нужно сделать 7 операций, с частотой 2 Гц.
Коннор Вольф

2
О, парень, один источник - 1,1 МБ, в архиве . Я думаю, что это немного излишне. Есть ли более простые варианты?
Коннор Вольф

2
Что еще более важно, эта библиотека (1) предназначена для вычислений с плавающей запятой произвольной точности (а не для собственного размера, как 32-разрядные и 64-разрядные) и (2) предназначена для компиляторов Linux на процессорах i386 и x64 Intel, AMD и MIPS. В исходных папках есть упоминания о «arm» и «generic», но я бы не стал здесь начинать.
Кевин Вермеер

2

Похоже, что этот вопрос взял на себя склонность к поиску понимания больше, чем к решению проблемы, так что это может быть не самый полезный ответ, но только ради полноты

http://code.google.com/p/propgcc/wiki/PropGccCompileOptions

Подразумевает, что версия GCC с пропеллером имеет поддержку с плавающей запятой, в том числе удваивается.

GCC и его библиотеки компиляторов, конечно, с открытым исходным кодом, хотя может возникнуть реальная кривая обучения, прежде чем вы сможете увидеть, что делает код.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.