상세 컨텐츠

본문 제목

자연로그 ln을 구현해보자.

프로그래밍/테크닉

by ∫2tdt=t²+c 2008. 12. 3. 01:55

본문

저번 글에서 지수함수를 구현하는 글을 대충 올렸었다. 지수함수를 구현했다면 역함수는 로그함수도 한번 꼭 구현해볼 필요가 있다.
지수함수(exp)와 로그함수(ln)를 이용하면 pow함수를 구현할수 있다. 사실 로그함수가 제곱근 함수 다음으로 널리 쓰인다고 볼 수도 있는데, 지수함수를 먼저 구현한 이유는 로그함수 구현은 꽤 까다롭기 때문이다. 잡소리 그만하고
자연로그란 밑이 e(=2.71828...)인 로그를 일컫는다.
수학적 정의는 다음과 같다.

이면

이다.


모든 부동소수점 데이터는

꼴로 나타낼수 있으므로 여기에 로그를 취하면

이렇게 된다. ln2는 상수값이므로 중요하지 않고 n*ln2도 곱셈으로 계산가능하다. 우리가 구현해야할것은 

를 계산하는 부분이다.


두고두고 써먹는 테일러 전개를 이용해서 자연로그 함수를 다항함수꼴로 전개해보자.

(단 |x|<=1 일때만 수렴)

가 0에서 2사이이므로 x는 -1에서 1사이가 된다.

따라서 이 전개식을 계산하면 될듯하지만
이 전개식은 치명적인 약점을 가지고 있다. 수렴속도가 매우 느리다는 것이다!!!
위 전개식처럼 부호가 번갈아 나오는 교대부호급수는 수렴속도가 너무 느려서 차마 봐줄수가 없다.
그래서 수학자들이 해결책을 내놓았다.


두 테일러 전개식이 있다. 수렴범위 내에서는 항끼리 자유롭게 더하고 뺄수도 있다.
위식에서 아래식을 뺀다.

로그끼리의 뺄셈은 나눗셈으로 바꿀수 있다는 것을 기억하라.

따라서

이다.

여기서

라고 하면

z(1-x)=1+x
z-zx=1+x
z-1=zx+x
z-1=x(z+1)
(z-1)/(z+1)=x

가 된다.

z값이 어떤 양의 실수이던간에 x값은 |x|<=1을 벗어나지 않는다.
따라서 모든 양의 실수 z에 대해 다음과 같이 쓸수 있다.

전개식의 모든 항이 같은 부호로 되어있다. 이것은 무엇을 의미할까?
엄청난 수렴속도!!!

테스트로 ln 5 를 구해보자.
z = 5 라고 하면

계산해보면 대략 1.60 정도가 나오는데 ln 5의 값 맞다!



최적화를 해보자.
계속 반복되는

값을 먼저 계산해놓고 변수로 두면 연산량을 획기적으로 줄일수 있다.

( x=(z-1)/(z+1) )
이 전개식도 잘 묶으면

과 같이 된다.
여기서 x^2의 값도 미리 계산해서 두면 연산량을 더 줄일수 있다.

역시 적당한 항까지 취해서 원하는 정밀도까지 계산해나가면 된다.



관련글 더보기

댓글 영역