pow를 지양해야 하는 이유

2019. 8. 23. 23:37알고리즘/암기

백준의 https://www.acmicpc.net/problem/1740 거듭제곱 문제를 풀다가 pow를 쓰다가 계속 틀렸다

 

이유는 pow 함수의 원형은 double형 실수 연산인데, 수가 커질수록 오차가 커지기 때문이다

[참고] https://stackoverflow.com/questions/46257089/error-with-the-pow-function

 

따라서 큰 수에 대해서는 곱셈 알고리즘을 사용하는 것을 권장한다

 

typedef unsigned long long ull;

ull involution(int a, int b) {
	if (b == 0) {
		return 1;
	}
	else if (b == 1) {
		return a;
	}
	ull tmp = involution(a, b / 2);
	if (b % 2) {
		return tmp * tmp * a;
	}
	else {
		return tmp * tmp;
	}
}

 

실제 gcc에서 컴파일한 결과

 

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char **argv) 
{
    printf("%lld\n", (long long)pow(2, 63));
    return 0;
}

 

9,223,372,036,854,775,807가 출력되는데 실제 값은 9,223,372,036,854,775,808이다