본문 바로가기
프로그래밍/JAVA

Math.pow 보다 long형에 직접 지수 값을 계산하는 것이 나은 이유

by vivi 2021. 11. 2.

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 범위의 정수를 담으면 안된다.

댓글