Some Practices/바킹독 실전 알고리즘 강좌 수강

실수 자료형의 주의점

mitdog 2024. 7. 11. 22:43

IEEE-754 format

sign -> 부호
exponent -> 지수(과학적 표기법)
fraction -> 유효숫자

이렇게 저장됨으로써 생기는 문제점들을 기억해야 한다.

1. 실수의 저장/연산 과정에서 반드시 오차가 생긴다.

다음 예시를 보자.

if(0.1+0.1+0.1 == 0.3) printf("true\n");
else printf("false\n");

결과는 놀랍게도 false가 출력된다.
0.1과 0.3은 둘 다 무한소수이고 0.1+0.1+0.1 을 하면서 오차가 커지게 되어 둘이 다르다고 나오게 된다.

하지만 오차 범위는 알 수 있고. (float은 $10^{-6}$, double은 $10^{-15}$)
double의 오차 허용 범위가 훨씬 크기에, 실수 자료형은 double을 쓴다.
(메모리가 모자랄 경우에는 float을 쓰는데.. 요즘 같은 시대에는 드문 일이다.)

2. double에 long long 범위의 정수를 함부로 담으면 안된다.

long long의 범위가 훨씬 더 큰 범위이기에, 옮겨질 때 오차가 생길 수 있다.
(다만, int의 경우는 문제가 없다. int는 더 작은 범위이기 때문에.)

3. 실수를 비교할 때는 등호를 사용하면 안된다.

아주 작더라도 오차가 있을 수 있기 때문이다.
굳이 쓰겠다면 둘의 차이가 $10^{-12}$(1e-12) 이하일 경우 동일하다고 하면 쓸 수는 있다.

'Some Practices > 바킹독 실전 알고리즘 강좌 수강' 카테고리의 다른 글

Pair STL  (5) 2024.07.22
Deque STL  (0) 2024.07.18
Queue STL  (0) 2024.07.17
Stack STL  (0) 2024.07.17
List STL  (0) 2024.07.11