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이다
'알고리즘 > 암기' 카테고리의 다른 글
스택에서 top과 현재의 연관성을 보고 싶을 때 (0) | 2019.08.29 |
---|---|
위상정렬에서 BFS로 사이클 검사하는 방법 (0) | 2019.08.27 |
빈줄이 담겨진 string 입력을 받을 때 (0) | 2019.08.20 |
해시 hash (0) | 2019.08.13 |
STL 혼합 선택 (0) | 2019.08.10 |