Конечно, это возможно". Есть несколько проблем.
Каковы ваши требования к точности?
Готовы ли вы использовать сплайны более высокого порядка?
Сколько памяти вы готовы потратить на это? Линейная функция на достаточно малых интервалах будет аппроксимировать экспоненциальную функцию с любой необходимой степенью точности, но для этого может потребоваться ОЧЕНЬ маленький интервал.
Редактировать:
Учитывая предоставленную дополнительную информацию, я провел быстрый тест. Уменьшение диапазона всегда можно использовать для экспоненциальной функции. Таким образом, если я хочу вычислить exp(x) для ЛЮБОГО x, я могу переписать задачу в виде...
y = exp(xi + xf) = exp(xi)*exp(xf)
где xi — целая часть x, а xf — дробная часть. Целая часть проста. Вычислите xi в двоичной форме, затем повторные возведения в квадрат и умножения позволят вам вычислить exp(xi) за относительно небольшое количество операций. (Другие приемы, использование степеней двойки и других интервалов могут дать вам еще больше скорости для жаждущих скорости.)
Теперь осталось только вычислить exp(xf). Можем ли мы использовать сплайн с линейными сегментами для вычисления exp(xf) на интервале [0,1] всего с 4 линейными сегментами с точностью до 0,005?
Этот последний вопрос решается с помощью функции, которую я написал несколько лет назад, которая будет аппроксимировать функцию сплайном заданного порядка в пределах фиксированного допуска на максимальную ошибку. Этот код требовал 8 сегментов в интервале [0,1] для достижения требуемого допуска с помощью кусочно-линейной сплайн-функции. Если бы я решил еще уменьшить интервал до [0,0,5], я бы теперь мог достичь предписанного допуска.
Итак, ответ прост. Если вы хотите уменьшить диапазон, чтобы уменьшить x до интервала [0,0,5], затем выполните соответствующие вычисления, тогда да, вы можете достичь требуемой точности с помощью линейного сплайна в 4 сегментах.
В конце концов, вам всегда будет лучше использовать жестко закодированную экспоненциальную функцию. Все упомянутые выше операции, безусловно, будут медленнее, чем то, что предоставит ваш компилятор, ЕСЛИ доступно exp(x).
person
Community
schedule
08.08.2011
exp()
в стандарте С++. Почему вы избегаете его использования? Обычно у него хорошая скорость. - person George Gaál   schedule 08.08.20110-4095
: это целое число? Потому что алгоритм для целого x тривиален; просто сохраните e^1..e^2048 и умножьте на биты в x. 11 умножений в худшем случае. - person MSalters   schedule 08.08.2011exp(4095)
— очень, очень большое число. Наконец, см. netlib.org/fdlibm/e_exp.c . - person David Hammen   schedule 09.08.2011