본문 바로가기

Library/Numerical Analysis

Math Function Implementation

자신이 직접 수학 함수를 작성할 일은 없을 것이다. 그러나, 그럼에도 불구하고 아주 그런 일이 없을거라고는 할 수 없는데, 그것은 임베디드 환경에서 사용되는 CPU들이 부동소수점을 지원하지 않거나, 해당 컴파일러에서 제공하는 수학 함수가 끔찍한 성능을 보일 경우가 있기 때문이다. 물론, 이것도 꽤 오래 전 이야기이고, 지금은 그런 CPU들도 부동소수점을 처리하지 못하는 일은 거의 없다.

그리고, 대부분의 경우 이미 작성된 라이브러리의 수학 함수보다 더 좋은 성능을 보이는 수학 함수를 만든다는 것은, 들어가는 시간과 나오는 결과물을 비교해 봤을 때 좋은 생각은 아니다. 그러나, 수학 함수가 어떻게 구현되는지를 알고 있다면, 꼭 수학 함수를 작성하는 경우가 아니더라도, 수치 계산이 필요한 코드를 작성하는 경우, 좀 더 효율적으로 작성할 수 있을 것이다.

수학 함수를 구현하는데 있어, 가장 먼저 생각해야 할 것은 오차와 수행 시간의 트레이드 오프 사항이다. 즉, 컴퓨터에서 어떤 계산을 수행한다면 애초에 Truncation Error와 Round-Off Error 때문에 무한 정밀도로 계산하는 것은 불가능하다. 그리고, 오차를 줄이고자 한다면 그만큼의 수행 시간을 손해보게 되고, 수행 시간에 있어서 이득을 보고 싶다면 오차를 감수해야 한다. 이 두 가지 사항이 앞으로의 모든 수학 함수를 구현하는데 최적화의 가장 큰 원칙이 된다.

또, 최대한 미리 계산할 수 있는 수는 매직 넘버, 즉 상수로 미리 준비해야 하며, 이것은 초기 추측값이나 입력값의 제한, 또는 제한된 상수 시간 내에 계산을 하기 위해 필요한 것이다. 수학 함수는, 한 루프 안에서 몇 번이고 호출될 수 있기 때문에 이런 최적화에 신경을 써야 한다.