Log 함수에 대한 몇 가지 이야기

최근 우리 사장님(사장님 나빠요…의 그 사장님 맞습니다)이 학교에서 강의하시는 강의록을 보다가 Log에 관한 재미있는 내용을 보았습니다. 밑이 a인 Log는 어떻게 계산하는가에 대한 퀴즈인데요, 답은 아래 소개하겠지만, 프로그래밍 스킬이라기 보다는 Log의 기본 성질을 이용하는 것입니다.
제가 IDL에 대한 질문 중에서 Log와 관련된 질문과 답을 모아 보면 다음과 같이 정리됩니다. 아주 많이 받은 질문들이 아니기 때문에 순서를 정할 것 까지는 없습니다만 이게 전부 아닌가 하는 생각도 듭니다.

  • LOG 함수는 어디에 있는가?
    IDL에서 LOG 함수는 자연로그의 경우 ALOG(X), 상용로그의 경우 ALOG10(X) 와 같이 사용합니다. 이는 고전적 포트란의 함수를 그대로 따왔기 때문으로 생각됩니다(지금의 포트란은 대부분 LOG(X), LOG10(X)로 사용합니다).
    IDL> print, ALOG10(100)
    2.00000
  • 자연상수 e는 어떻게 사용하는가?
    필요한 정밀도에 따라 다르겠지만, e=2.7182818 과 같이 변수 e에 값을 대입하여 사용하는 것이 보기에 편할 수 있습니다. e^x 과 같은 계산이 많이 등장한다면 EXP() 함수를 사용하는 것이 편리할 수 있습니다.
    IDL> print, EXP(1)
    2.71828
    IDL> print, ALOG(EXP(3))
    3.0000
    최근 버전의 IDL에서는 !CONST 라는 시스템 상수(구조체) 가 있고, 이 안의 !CONST.EULER 가 자연상수(=오일러 상수)이기도 합니다.
    IDL> print, !CONST.EULER
    2.7182818
  • 밑(base)이 2인 로그함수는 어디 있는가? 밑이 b인 로그함수는 어디 있는가?
    기본 제공 로그함수는 자연로그(base=e)와 상용로그(base=10) 밖에 없습니다.  로그의 기본 성질을 이용해서 문제를 풀어야 합니다. 오래된 일이어서 잘 생각은 안나지만 LOGa(b) = LOG(b) / LOG(a) 임을 이용하는 것입니다. 즉, log2(4) = log(4) / log(2) 가 되겠지요. 그러므로 IDL에서 다음과 같이 밑이 2인 로그를 구할 수 있습니다.
    IDL> print, ALOG(4)/ALOG(2)
    2.00000

밑(base)이 b 인 일반적인 로그함수는 다음과 같이 구현할 수 있을 것입니다.

요즘 추세에 맞추어 그냥 LOG라는 이름으로 함수 이름을 지정하였고, BASE 키워드를 이용하여 다양한 베이스의 로그를 구할 수 있게 하였습니다. 만일 BASE 키워드를 사용하지 않는다면 b=10 이 되어 상용로그로 계산을 수행합니다. 그런데 저는 이런 함수를 만들어 놓고 잘 사용하게 되진 않더군요. ‘IDL에서 함수를 어떻게 만드는가’에 대한 예시로 더 많이 사용했던 것 같습니다.