< 정수자료형 >
| 자료형 | 크기 | 최솟값 | 최댓값 |
| 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
< 참고자료 >
[실전 알고리즘] 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 |