dongwha410   1년 전

아래의 코드는 일단 정답처리가 되는 코드입니다만

 double을 unsigned long long 으로 변경하면 틀렸다고 나옵니다.

둘다 8byte로 크기는 같은데 어디서 차이가 나는 건가요?

pill27211   1년 전

실수에서는 unsigned 자료형을 지원하지 않은걸로 알고 있었는데 아닌가요? float(4byte), double(8byte), long double(8바이트 이상. 시스템별로 상이함)로 세 가지가 있는걸로 알고 있습니다.

slah007   1년 전

unsigned long long으로 풀면 계산 과정에 사용하게 되는 30! 이 unsigned long long의 최대 범위(대략 1e19)보다 훨씬 커서 오버플로우가 납니다.

double로 풀면 아주 정확한 값을 저장하지는 못하는 대신에 훨씬 더 넓은 범위의 값을 표현할 수 있기 때문에 결과적으로 오버플로우는 없고 계산 결과가 0.5 이내(반올림 시 정답과 같음)의 오차 범위에도 들어 AC를 받는 것 같습니다.

N, M <= 30 정도에서는 괜찮은 것 같지만 실수형 자료는 오차를 예측하기가 어려워서 dobule을 쓰는 것보다 정수로 풀이하는 다른 방식을 쓰는 것을 권장합니다. (곱셈 없이 C(n, m) = C(n-1, m) + C(n-1, m-1)을 이용하는 등)

slah007   1년 전

실수형은 오차 때문에 틀리기 쉬워 참값이 필요한 경우 정수로 풀 수 있는 문제를 실수로 푸는 것을 부정적으로 생각하는 편이지만

8바이트 정수 long long으로 표현 가능한 최대 C(N, M)이 N, M <= 66 정도임을 생각할 때

8바이트 double을 쓸 경우 N, M <= 54

16바이트 long double을 쓸 경우 N, M <= 63 정도까지 참값과 일치하는 것을 보니 작은 수에 대해서는 충분히 쓸만한 것 같습니다.

댓글을 작성하려면 로그인해야 합니다.