Math.pow(double a , double b) 함수는 double 형을 인자로 받아 a의 b승을 계산하여 결과 값을 double 형을 반환하는 함수이다.
double 자료형은 총 64bit로, 부호를 나타내는 1비트, 지수를 나타내는 11bit 그리고 유효 숫자를 나타내는 52bit로 이루어져 있다.
2의 52승 값은 4,503,599,627,370,500으로 double형의 유효숫자는 15자리 까지 안전하다.
3의 38승을 계산해보면,
long p1 = 1;
for (int i = 0; i < 38; i++)
p1 *= 3;
double p2 = Math.pow(3, 38);
long p3 = (long) Math.pow(3, 38);
System.out.println("3의 38승 값 : 1350851717672992089");
System.out.println("long형에 저장한 3의 38승 : " + p1);
System.out.println("double형에 저장한 3의 38승 : " + p2);
System.out.println("Math.pow 함수로 계산한 3의 38승 : " + p3);
Math.pow 함수를 사용한 계산에서 결과값의 오차가 발생한 것을 알 수 있다.
long 형은 64bit 정수 자료형으로 유효숫자가 19자리이다.
따라서, 유효숫자 15자리 이상의 지수 값 계산을 할 때에는 Math.pow를 사용하면 오차가 생기므로, long형에 직접 지수값을 계산하는 것이 유효숫자 19자리까지 안전하다.
++ 마찬가지로, int 형의 값을 double에 담을 때는 문제가 없으나, long 형의 값을 double에 담으면 오차가 생길 수 있으므로 함부로 double에 long 범위의 정수를 담으면 안된다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[==null 의문] 대체 왜..? + ArrayList의 삭제 연산 (0) | 2021.11.13 |
---|---|
퀵 정렬 Quick Sort에 대하여 (0) | 2021.11.07 |
진수를 활용한 경우의 수 구하기 (0) | 2021.11.05 |
[JAVA] HashMap 에서 max 값의 key 구하기 (0) | 2021.10.21 |
댓글