사실 코딩 테스트 때 로그는 그렇게까지 중요도가 높지는 않다. 즉, 사용하지 않아도 문제를 풀 수 있다.
하지만 필자는 자릿수를 구하는 문제이거나 규칙을 가진 상황에서 특정 값의 Index를 구하는 종류의 문제들은 주로 log를 활용한다.
굳이 이렇게 풀지 않아도 되지만 수학을 좋아했던 예전 기억이 남아 있어서 이런 게 아닐까 싶다.
어차피 활용할 거 제대로 한 번 정리해보자고 결정했고, 이왕 정리하는 거 log의 반대 성질을 가진 거듭제곱까지 한 번에 정리하기로 하였다.
Java에서 log를 사용하는 방법은 총 3가지 존재한다.
밑이 e(자연 상수)인 ln(x) 값을 반환하는 Math.log(x), 밑이 10인 log(x) 값을 반환하는 Math.log10(x), 마지막으로 ln(x+1) 값을 반환하는 Math.log1p(x)이다.
실제로 각 메서드가 위에서 기입한 함수 결과를 반환하는지 코드를 통해 확인해보자.
(참고로 자연 상수 e는 Math.E로 사용할 수 있다)
System.out.println("[Math.log는 ln(x)일까?]");
System.out.println(Math.log(Math.E)==1? "맞다" : "틀리다");
System.out.println("[Math.log10은 log10(x)일까?]");
System.out.println(Math.log10(10)==1? "맞다" : "틀리다");
System.out.println("[Math.log1p는 ln(x+1)일까?]");
System.out.println(Math.log1p(Math.E-1)==1? "맞다" : "틀리다");
이렇게 3가지 방법이 존재하지만 사실 Math.log()만 알고 있으면 된다.
그 이유는 수학 공식에는 "로그의 밑변환 공식"이라는 수식이 존재하기 때문이다.
위 이미지가 로그의 밑변환 공식인데 이를 사용하면 Math.log()만 사용해도 모든 log 함수를 만들 수 있다.
예를 들어 밑이 2인 로그 log₂(x)를 구하고 싶을 경우 ln(x)/ln(2)를 수행하면 되므로 Math.log(x)/Math.log(2)를 통해 구할 수 있다.
이를 확장시키면 밑이 r인 로그 logᵣ(x)를 구하고 싶을 경우 Math.log(x)/Math.log(r)을 계산하면 구할 수 있게 되는 것이다.
따라서 log 관련 모든 함수를 외우지 말고 Math.log()와 로그의 밑변환 공식을 활용하자.
Math.log를 사용할 떄 주의할 점이 있다.
바로 Math.log(0)이 안되도록 주의할 것!
알다시피 log 함수는 진수로 0 값이 들어올 수 없다.
마찬가지로 Math.log(0)으로 ln(0)을 만들어버린다면 계산상 오류가 발생할 수 있으므로 0 값이 주입되지 않도록 주의하자.
Java에서 거듭제곱은 Math.pow 함수를 활용한다.
Math.pow(double x, double y) // x^y
Math.pow(double a, double b)
메서드는 aᵇ 결괏값을 반환한다.
이때 알아야 하는 것은 Parmeter인 a와 b의 자료형은 double이고, Math.pow() 결괏값 또한 double 자료형을 가진다는 것이다.
이런 특징 때문에 a 거듭제곱을 수행할 때 aa...*a 연산을 수행하는 것보다는 Math.pow() 활용을 추천한다.
코드를 통해 왜 Math.pow()를 추천하는지 알아보자.
int a = Integer.MAX_VALUE/2;
System.out.println(a*a);
System.out.println(Math.pow(a,2));
직접 a*a를 수행했을 경우 Overflow 때문에 음수 & 부정확한 연산 결과가 도출되었다.
하지만 Math.pow(a,2)를 통해 거듭제곱을 수행했을 경우 정확한 곱연산 결과가 도출되었음을 확인할 수 있다.
Math.pow()는 double 자료형으로 결괏값을 처리하는데 double 자료형은 8 Byte 공간으로 데이터를 처리한다.
즉, 4 Byte를 활용하는 int 자료형보다 더 많은 범위의 수를 나타낼 수 있게 되는 것이다.
거듭제곱은 알다시피 연산의 결과증가폭이 기하급수적으로 증가하므로 최대한 넓은 범위를 처리할 수 있는 Math.pow() 연산 사용을 추천하는 것이다.