C++ 정수, 실수 자료형 범위와 주의할 점

< 정수자료형 >

 

자료형 크기 최솟값 최댓값
short 2byte -2^15 (= -32768) 2^15 - 1 (= 32767)
int 4byte -2^31 (≒ -2.1 * 10^9) 2^31 - 1 (≒ 2.1 * 10^9)
long long 8byte -2^63 (≒ -9.2 * 10^18) 2^63 - 1 (≒ 9.2 * 10^18)

 

만약 unsigned long long보다 더 큰 범위의 정수를 저장해야한다면 string으로 저장해야된다.

 

 

 

< 실수 자료형 >

 

자료형 크기 최솟값(lowest) 최댓값(max) 최소유한값(min)
float 4byte -3.4 * 10^38 3.4 * 10^38 1.1 * 10^-38
double 8byte -1.7 * 10^308 1.7 * 10^308 2.2 * 10^-308

 

▶ 저장 영역

(sign field : 부호, exponent : 지수, fraction field : 유효숫자)

 - float형 : sign(1bit) + exponent(8bit) + fraction(23bit)

 - double형 : sign(1bit) + exponent(11bit) + fraction(52bit)

 

▶ 유효숫자

float의 유효숫자 23bit = 8,388,608 ≒ 8.3 * 10^6 => 유효숫자 6자리 (7자리부턴 모든 수 표현 불가)

double의 유효숫자 52bit = 4,503,599,627,370,500 ≒ 4.5 * 10^15 => 유효숫자 15자리 (16자리부턴 모든 수 표현 불가)

 

그러므로 float은 상대오차 10^-6까지 안전하고 double은 상대오차 10^-15까지 안전하다.

풀어서 말하면 float은 참값이 1일 때 float은 1-10^-6 ~ 1+10^-6 사이의 값을 가지고 double은 1-10^-15 ~ 1+10^-15 사이의 값을 가진다.

 

 

2024.03.27 업데이트

https://pang2h.tistory.com/184

위 글을 보면 유효숫자는 소수점부터가 아니라 가장 높은 자리수부터라고 한다. 그러면 위에 쓴 float는 10^-6까지 안전하고 double은 10^-15까지 안전하다는 건 잘못된 얘기인듯...근데 이거에 대해 더 찾아보려해도 내가 딱 원하는 내용이 안 나오는 것 같고 소수점부터라는 글이 훨씬 많아서...잘 모르겠다...

 

 

 

< 주의할 점 >

 

1. double에 long long 범위의 정수를 넣지 않기

double보다 long long의 유효숫자가 더 크기 때문이다.

ex) 10^18과 10^18+1을 double에 저장하면 구분이 되지 않아 같은 값이 저장된다 => 이로 인해 오차가 생긴다.

(double에 int 넣는 건 가능!)

 

2. 실수를 비교할 땐 등호를 사용하지 않기

ex) 0.1+0.1+0.1 == 0.3 (X)

abs(0.1+0.1+0.1, 0.3) < 1e-12 (O)

 

 

< + >

백준 1914번을 풀다가

pow(2, 100)은 double형의 유효숫자보다 큰데 왜 정확히 계산되는지 궁금해서 이 글을 쓰게 된건데...

pow(2, n)은 좀 특별해서(?) pow(2,1000)을 해도 정확하게 값이 계산된다고 한다...이게 맞는지도 모르겠음...ㅋㅋ

pow(3, n) 결과를 double형에 저장하면 16자리까지만 정확하고 그 이후로는 오차가 있다.

c++ pow(2,1000) is normaly to big for double, but it's working. why? - Stack Overflow

 

c++ pow(2,1000) is normaly to big for double, but it's working. why?

the code: #iclude <math.h> int main(){ double somenumber = pow(2, 1000); printf("%lf\n", somenumber); return 0; } i get this huge number:

stackoverflow.com

 


< 참고자료 >

https://blog.encrypted.gg/922

 

[실전 알고리즘] 0x01강 - 기초 코드 작성 요령 I

안녕하세요, 바킹독입니다. 이번 단원에서는 기초 코드 작성 요령을 익혀보려고 합니다. 목차를 보셨으면 알겠지만 기초 코드 작성 요령이 두 강으로 나눠져있는데 앞으로 코드를 잘 짜기 위해

blog.encrypted.gg

 

'CS > C++' 카테고리의 다른 글

C++로 이진탐색(BinarySearch)  (0) 2023.08.22
C++로 BFS, DFS 구현  (0) 2023.08.09
[C++] Vector VS List  (0) 2023.07.20
C++ Deque VS Vector  (0) 2023.07.12
C++로 덱 구현  (0) 2023.07.11