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!은 너무 커서 정확한 값을 실수로 표현할 수 없기 때문이다.