2016-11-09 5 views
0

임의의 정밀도 산술을위한 라이브러리를 프로그래밍 중입니다. 내가 직면하고있는 마지막 문제는 힘 기능이다. 나는 x^y 대신에 2^(y log2(x))을 계산했으며, 하나의 하위 문제가 남아 있다고 생각했습니다. (0,1) (0과 1은 제외) 범위의 x으로 2^x을 효율적으로 계산하려면 어떻게해야합니까?2^x의 수치 근사법

어쨌든 나는 분명히 합계를 저장하기 때문에, x의 형태는 p/q (p < q)입니다. 따라서 (위키 백과의 n 번째 루트 알고리즘 https://en.wikipedia.org/wiki/Nth_root_algorithm)의 q 번째 루트를 계산 한 다음 결과를 p으로 계산할 수 있습니다.

그러나 이것은 매우 비효율적 인 것처럼 보입니다. 어떤 우수한 알고리즘이 있습니까? 당신의 도움을 주셔서 감사합니다.

+1

당신이 그것에 대해 더 생각한다면 자연 로그가 왜 자연인지를 알게 될 것입니다. 'exp (y * ln (x))'는 상수가 적다. -이 기능들의 입증 된 구현을 위해 [bc libmath] (http://www.rkeene.org/viewer/devel/old/bc-dos/bc/libmath.b.htm)를 공부하십시오. – LutzL

+0

기본 사항에 대해서는 [음의 지수에 대한 제곱에 의한 힘] (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

이 Taylor 시리즈의 O (n) 수렴. 배정도 정확도를 위해서는 많은 용어가 필요합니다. – duffymo

+0

'x = ln 2 = 0.69 ...'(OP가 요구하는 최대 값)과 배정도에 필요한 @duffymo는'x^16/16! '이후'x^15/15!'입니다. = 1.3..E-16 <1/2^52'. – coproc