https://stackoverflow.com/questions/35893305/factorial-program-in-c-is-wrong-after-20
이 모든것에 대한 요약.....
스택오버플로우없이 못살아
첫 번째 문제...
30!, 30 팩토리얼이 1409286144로 뜬다
10!이 3628800였는데?
int형으로 만들어 돌렸는데 이렇게 떴다.
계산기로 찾아보니까
http://mwultong.blogspot.com/2005/12/factorial-table-1100-0-100.html
265252859812191058636308480000000
라는 값이라녜?
그때 딱 드는 예감
아 long이나 long long으로 하면 되는거 아닐까
https://docs.microsoft.com/ko-kr/cpp/cpp/data-type-ranges?view=msvc-170
type int의 최대값은 2147483647
참고로 signed와 unsigned가 있는데, signed는 부호가 있는거, unsigned는 부호가 없는 것이다.
아마 첫번째 빗에 0 1로 음수 양수를 정하는게 아닌가 생각된다(추측, 찾아봐야 함)
때문에 부호가 있는 쪽은 부호가 없는 쪽보다 정확히 2배 적게 표기할 수 있다(양수 기준)
기본형은 signed를 포함하고 있다. 제곱같은 어차피 양수를 쓰는 계산들은 unsigned를 써도 될듯.
절대값이라던가
여튼 30!을 표기하기엔 너무 적은 양이다
long의 최대값은 2147483647
잉? 작다...
그렇다 아마 int형인 2바이트였는데 4바이트로 바뀌면서 그렇게 되었나 보다...
이미 대부분의 컴퓨터에선 int가 long까지 포함할수 있다는? 그런건가?
여튼 그럼 long long은 8바이트라 더 표현할 수 있다.
9223372036854775807
근데 이걸로도 265252859812191058636308480000000을 표기하기엔 너무 적다.
결론은 정수형 데이터들로는 표현할 수 없다는 거다.
그럼 뭘로 하냐.. double
double의 범위는 10의 380승까지 표기가 가능하다고 한다.
당연히 저정도는 표기할 수 있다.
https://dojang.io/mod/page/view.php?id=34
int > %d
long > %ld
long long > %lld
단순하다...
double > %f
그래서 double로 하면?
265252859812191032188804700045312
짠 잘나온다
아니? 안나온다.
265252859812191058636308480000000
265252859812191032188804700045312
암만봐도 값이 다르다
얘가 사람도 아니고 틀릴수가 없는 컴퓨터인데 왜 이러지?
하고 찾아보면 이제
두번째 문제
찾아보니까...
여기서 진짜 잘 설명되어 있음.
대충 요약하자면 실수형 자료는 최대 정밀도와 유효 정밀도가 있고
double형은 15~16자리까지가 유효 정밀도라는 소리. 그 이후에는 오차가 생길 수 있다.
https://dojang.io/mod/page/view.php?id=738
여기 설명도 도움이 꽤 된다.
https://devlog-wjdrbs96.tistory.com/254
여기도 참고했다.
이후 더 큰 숫자는 계산을 못하거나
이렇게 나온다
https://scripting.tistory.com/352
이런 방식들도 있는 모양
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=dnpc7848&logNo=220329515202
나중에 참고하면 좋을듯
'C' 카테고리의 다른 글
[프로그래머스] 연습문제 도장깨기 (0) | 2022.03.08 |
---|---|
[프로그래머스] 두 정수 사이의 합 (0) | 2022.03.08 |
[프로그래머스] 2016년 (0) | 2022.03.06 |