Я пишу программу C для микроконтроллера PIC, которая должна выполнять очень специфическую экспоненциальную функцию. Мне нужно рассчитать следующее:
A = k. (1 - (p/p0) ^ 0,19029)
k и p0 постоянны, поэтому все это довольно просто, кроме поиска x ^ 0.19029
(p/p0) всегда будет находиться в диапазоне 0-1.
Это хорошо работает, если я добавляю в math.h и использую функцию power, за исключением того, что использует всю доступную 16 Кбайт памяти программы. Расскажите о вирусах! (Остальная часть программы без функции питания = ~ 20% использования флеш-памяти, добавьте функцию math.h и power, = 100%).
Я хотел бы, чтобы программа сделала и другие вещи. Мне было интересно, могу ли я написать специальную реализацию случая для x ^ 0.19029, возможно, используя итерацию и какую-то таблицу поиска.
Моя идея состоит в том, чтобы создать справочную таблицу для функции x ^ 0.19029, возможно, 10-100 значений x в диапазоне 0-1. Код найдет близкое совпадение, затем (каким-то образом) итеративно уточнит его, повторно масштабируя значения таблицы поиска. Тем не менее, здесь я теряюсь, потому что мой крошечный мозг не может визуализировать математику.
Может ли этот подход работать?
В качестве альтернативы я рассмотрел использование Exp (x) и Ln (x), которые могут быть реализованы с расширением Тейлора. b ^ x можно найти с помощью:
b ^ x = (e ^ (ln b)) ^ x = e ^ (x.ln(b))
(См.: Википедия - полномочия через логарифмы)
Это выглядит немного сложным и сложным для меня. Возможно ли, чтобы реализация была меньше, чем математическая библиотека компилятора, и могу ли я упростить ее для моего особого случая (т.е. Base = 0-1, показатель всегда 0.19029)?
Обратите внимание, что в настоящий момент использование ОЗУ в порядке, но на Flash (для хранения кода) я мало работал. Скорость не критична. Кто-то уже предположил, что я использую более крупный микрофон с большим количеством флэш-памяти, но это звучит как расточительная расточительность!
[EDIT] Я ленился, когда сказал, что соотношение "(p/p0) всегда будет в диапазоне 0-1". На самом деле он никогда не достигнет 0, и я сделал некоторые расчеты прошлой ночью и решил, что на самом деле диапазон 0,3 - 1 будет вполне адекватным! Это означает, что некоторые из более простых решений, приведенных ниже, должны быть подходящими. Кроме того, "k" в приведенном выше примере - 44330, и я хотел бы, чтобы ошибка в конечном результате была меньше 0,1. Я предполагаю, что это означает, что ошибка в (p/p0) ^ 0.19029 должна быть меньше 1/443300 или 2.256e-6