LINUX.ORG.RU

Как (быстро) работать с десятичными дробями в МК?

 , , , ,


2

3

Всем доброго времени суток. На контроллере (а конкретно STM8 семейства) нет FPU. Встала задача - выполнить кое-какие вычисления на нем (в основном вычисление синусов и косинусов чисел, подаваемых извне). Контроллер, ясно дело, сменить не могу - уже выпустили 10000 плат и вдруг тут менеджер говорит мне реализовать новую фичу. Если брать int, то загрузка проца при вычислениях около 30%. При использовании чисел с плавающей запятой время реакции МК на событие в 5 раз больше нормы. Может быть, есть какой нибудь менее времязатратный способ работы с десятичными дробями? Точность нужна только в пределах 3-4 знака. Заранее спасибо.

для синусов-косинусов используй lookup table, а для математики либо инты, либо fixed-point — и всё будет летать. в википедии есть статьи по этим темам.

anonymous
()

используй fixed point (например, int32 = float16.16)
вычислять синусы либо через таблицы Брадиса в ПЗУ, либо через CORDIC

Egor_
()

Точность нужна только в пределах 3-4 знака.

А если без синусов, то просто переведите в 64-bit, умножьте на 10000 и рисуйте точку :)

vodz ★★★★★
()

Fixed point. Скорее всего кем-то уже реализован для твоего контроллера

Dark_SavanT ★★★★★
()
Ответ на: комментарий от vodz

Гениально. В плохом смысле. Предложение переводить что-то в 64 бита в 8-битном микроконтроллере STM8.

Предоложение рисовать точку видимо ещё гениальнее, так как я не понял, что за точка имеется ввиду.

Посмотрел справку по STM8. Компиляторы C для него поддерживают 32-битные действительные числа. Не поддерживают 64-битные действительные и целые чисоа. По скорости работы с действительными числами различаются: по тесту Whetstone быстрее оказался IAR . В общем, самостоятельно сравнить компиляторы.

Partisan ★★★★
()
Ответ на: комментарий от Partisan

Предоложение рисовать точку видимо ещё гениальнее, так как я не понял, что за точка имеется ввиду.

Тут нет ничего гениального, а стандартное решение для небольшой точности. Точка рисуется при выводе, так как в расчётах её не будет. Но для тригонометрии, конечно не подойдёт.

vodz ★★★★★
()
Ответ на: комментарий от Partisan

sdcc поддерживает 64-битные инты. iar, скорее всего, тоже.

anonymous
()
Ответ на: комментарий от Partisan

C для него поддерживают 32-битные действительные числа

Синус с 3-4 значащими числами уместится даже в 16-битном INT. Вот только достаточно ли будет такой точности? Помню один чувак очень долго пытался фракталы рисовать. Три месяца мучился, пока ПИ с 3.14 на 3.14159 не поменял.

imul ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.