2016-11-09 6 views
0

Я программирую библиотеку для произвольной арифметики точности. Последней проблемой, с которой я столкнулся, является функция мощности. Я решил вычислить 2^(y log2(x)) вместо x^y и остается одна подзадача: как я могу эффективно вычислить 2^x с x в диапазоне (0,1) (ноль и один исключены).Численное приближение 2^x

Поскольку я, очевидно, храню рациональные методы, x имеет форму p/q (p < q). Поэтому я мог бы вычислить q-й корень 2 (алгоритм n-го корня Wikipedia https://en.wikipedia.org/wiki/Nth_root_algorithm), а затем проинформировать результат на p.

Однако это кажется очень неэффективным. Есть ли какой-либо превосходный алгоритм? Спасибо за вашу помощь.

+1

Если вы думаете больше об этом, вы обнаружите, почему естественный логарифм называется естественным. Нет смысла основывать все на 2. 'exp (y * ln (x))' имеет меньше констант. - Изучите [bc libmath] (http://www.rkeene.org/viewer/devel/old/bc-dos/bc/libmath.b.htm) для доказанной реализации этих функций. – LutzL

+0

см. [Power by squaring for negative exponents] (http://stackoverflow.com/a/30962495/2521214) для основ, а затем сублинсы для более продвинутых материалов, в частности, «fixed point bignum pow» – Spektre

ответ

2

С 2^x = e^(x ln 2) и e^x = 1 + x + x^2/2! + x^3/3! + ... это может быть путь. Расширение серии для e^x быстро сходится для ограниченного x (как в вашем случае).

+0

Если x все еще слишком больших для быстрой сходимости ряда тождество e^x = (e^(x/2))^2 можно использовать несколько раз. – Henry

+0

O (n) сходимость для этого ряда Тейлора. Вам понадобится много терминов для точности с двойной точностью. – duffymo

+0

@duffymo для 'x = ln 2 = 0.69 ...' (максимальное значение, запрошенное OP) и двойной точностью требуется последний термин 'x^15/15!' С 'x^16/16! = 1.3..E-16 <1/2. 52. – coproc

Смежные вопросы