더북(TheBook)

1.3.37 지수 함수. x가 실수라고 가정한다. 테일러 급수 전개를 이용해 ex = 1 + x + x2/2!+x3/3!+...를 total에 할당하는 코드 조각을 작성하라.

 

정답: 이번 문제의 목적은 math.exp() 같은 라이브러리 함수들이 어떻게 기본 연산자들을 이용해 구현되는지 생각해보도록 하기 위한 것이다. 직접 문제를 풀어보고 나서 여기에 나온 정답과 비교해보라.

먼저 항이 하나인 경우부터 시작해보자. x는 실수, n은 정수라고 가정하라. 다음 코드에서 루프 하나는 분자(num), 다른 하나는 분모(den)를 계산하고 나서 결과를 나누는 직접적인 방법을 이용해 xn / n!을 term에 할당한다.

num = 1.0
den = 1.0
for i in range(1, n+1):
    num *= x
for i in range(1, n+1):
    den *= i
term = num / den

그러나 다음 코드처럼 루프 하나로 계산하는 것이 더 계산 효율적이다.

term = 1.0
for i in range(1, n+1):
    term *= x / i

두 번째 코드는 더 함축적이며 우아할 뿐만 아니라 큰 숫자를 계산할 때 발생할 수 있는 부정확성을 피할 수 있어서 더욱 좋은 방법이다. 예를 들어 첫 번째 코드는 x = 10, n = 100인 경우 문제가 생긴다. 100!은 너무 커서 정확한 값을 실수로 표현할 수 없기 때문이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.