예전에 공부하고 GitHub에 놔뒀던거 가져오기
정수 자료형
char 자료형은 1 byte = 8 bit 이다.
= 8개의 0 혹은 1이 들어가는 칸을 이용해 표현된다.
char 의 경우 : 첫칸이 2^-7 로 -128 ~ 127 의 범위를 가지게 됨.
unsigned char 의 경우 : 첫칸이 2^7 로 0 ~ 255 의 범위를 가지게 됨.
그 외 정수 자료형에는,
- short (2 byte) / 2^15-1 (=32767)
- int (4 byte) / 2^31-1 (=2.1 x 10^9)
- long long (8 byte) / 2^63-1 (=9.2 x 10^18)
코테의 경우 int가 longlong보다 연산 속도와 메모리 모두 우수하지만,
문제 풀이시 int 자료형이 표현할 수 있는 범위를 넘어서는 수를 저장해야 한다면
반드시 longlong 자료형을 사용해야 한다.
그 이유는 Integer Overflow,
이진수 덧셈을 할 때, 음수를 위해 배정한 첫 자리의 수가 바뀌어 결과값이 달라지는 경우가 발생하기 때문.
실수 자료형
- 실수의 경우에도, 2진수의 음수 거듭제곱을 사용해 표현할 수 있다.
e.g. 3.75 = 2 + 1 + 0.5 + 0.25 = 2^1 + 2^0 + 2^-1 + 2^-2 = 11.11(2) - 2진수에서도, 유효숫자와 지수를 사용해 표현할 수 있다.
e.g. 11101.001(2) = 1.1101001(2) x 2^4
따라서 실수를 나타낼 때 sign, exponent, fraction field로 나누어 저장한다.
이 방식을 IEEE-754 format 이라고 함
sign field : 해당 수가 음수인지 양수인지 저장
exponent field : 과학적 표기법에서 지수를 저장
fraction field : 유효숫자를 저장
float 의 경우 : 1 + 8 + 23 bit = 4 byte
double 의 경우 : 1 + 11 + 52 bit = 8 byte
이로 인해 발생하는 실수의 특징들이 있는데,
1. 실수의 저장과 연산 과정에서 반드시 오차가 발생할 수 밖에 없다.
e.g. 0.1+0.1+0.1 != 0.3
float 은 유효숫자가 6자리로, 상대 오차 10^-6 까지 안전
double 은 유효숫자가 15자리로, 상대 오차 10^-15 까지 안전
2. double에 long long 범위의 정수를 함부로 담으면 안된다.
double은 유효숫자가 15자리인데, long long은 최대 19 자리로 같은 값이 저장될 수 있음.
= 오차가 섞인 값이 저장될 수 있다.
int 는 최대 21억이기 때문에 double에 담아도 오차가 생기지 않는다.
3. 실수를 비교할 때는 등호를 사용하면 안된다.
1번과 같은 오차 때문에 두 실수가 같다고 처리 할 때는,
아주 작은 값, 대략 10^-12 이하면 동일하다고 처리를 하는 게 안전.
10^9 가 필요하면 1000000000 로 사용해도 되지만, le9로 사용 가능.
'공부 > CS' 카테고리의 다른 글
시간, 공간 복잡도 (0) | 2024.04.23 |
---|