сделать свой собственный пау () - PullRequest
1 голос
/ 21 марта 2012

У меня есть проект, в котором мы пытаемся сократить объем кода.У нас есть одно место в одном файле, которое вызывает функцию pow () из математической библиотеки, которая добавляет дополнительно + 12 КБ кода в последний гекс для этой одной строки кода.Я провел некоторый поиск и не могу найти хороший способ выполнения функции pow вне математической библиотеки.Каждый пример, который я нашел, использует библиотеку математики.Хуже всего то, что мне нужна плавающая точка, потому что мне нужно поднять некоторую неизвестную переменную, которая постоянно изменяется до степени 1,4, а контроллер, который мне сказали, на самом деле не имеет плавающей точки.Мне говорят, что это 32-битное ARM-устройство 72 МГц, которое не имеет плавающей запятой, а значит, огромное пространство для одной библиотечной функции.Кто-нибудь еще пытался сделать это и выиграл битву?

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Ваша задача несколько проще, чем написание обобщенной функции pow (), поскольку показатель степени фиксирован.Вы также можете немного ослабить требование к точности с помощью полнофункциональной функции pow ().

Вариант 1: реализовать расширение Taylor Series для f (x) = x ^ 1.4,Вам нужно будет выбрать какое-то значение x, о котором нужно расширить ряд Тейлора, и вы потеряете точность по мере удаления x от этого значения.

Вариант 2: Построить таблицу интерполяции путем табулирования значений x ^ 1.4 в некотором количестве точек, а затем использовать линейную (или полиномиальный порядок более высокого порядка) интерполяцию для вычисления значений в промежуточных точках.

1 голос
/ 21 марта 2012

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

Поскольку показатель степени фиксирован, это может значительно упростить ваш код, начиная с 1.4 = 7/5. Теперь вам просто нужно написать единственную функцию, которая выполняет эти два точных шага одновременно на вашем целочисленном вводе, и вы можете избежать потерь вычислений с плавающей запятой.

0 голосов
/ 21 марта 2012

Вы могли бы избежать меньшего количества кода, используя float вместо double и powf():

float var=0.12345f;
var=powf(var,1.4f);

Естественно, результат будет менее точным.

...