코딩 테스트 문제를 풀던 중 나누기 연산을 해야하는 문제가 있었다.
나누기 연산 후 소수점 아래 N자리 까지 반올림 연산을 해야하기 때문에 float를 사용하여 문제를 해결하고자 하였다.
하지만 예시를 모두 맞췄지만 문제를 해결할 수 없는 상황이 일어나 여러 고민과 주변인에게 조언을 구한 결과
실수의 자료형에 문제가 있다는 것을 알게 되었다.
먼저 float는 6자리까지 표현이 가능한 실수 자료형이다. 또한 double은 15자리까지 표현이 가능한 실수 자료형이다.
이러한 차이는 정수 부분이 긴 실수 인 경우 문제가 발생할 수 있다.
123456789.123을 두 자료형에 넣는 경우 float의 경우 123456792.000000이라는 값이 담아지고,
double의 경우 123456789.123000이 담아진다.
float의 경우 1bit의 부호 비트와 8bit의 정수부분 23bit의 실수 부분으로 이루어져있다.
double의 경우 1bit의 부호 비트와 11bit의 정수부분 52bit의 실수 부분으로 이루어져있다.
이러한 차이는 float의 경우 값의 길이가 커지는 경우 근사 값을 사용하는 문제가 발생할 수 있으며,
무한 소수가 변수 공간에 담아지는 경우 자료형 크기에 따른 소수점 절삭으로 인해 오차가 발생할 수 있다.
0.1을 예로 들어보면 0.1이라는 값은 보기에는 간단한 값이지만 2진수로 바꾸면
0.0001100110011... 인 무한 소수가 된다.
물론 기본 출력 시 0.100000이 나오겠지만, 10자리 까지 출력하게 된다면 0.1000000015가 출력된다.
무한 소수 문제는 더 큰 자료형인 double을 사용하면 해결할 수 있다.
결론적으로 소수점 연산 시 float보다 double을 사용해야한다.
(출처)
https://jimmy-ai.tistory.com/64
'C++ STL, 알고리즘' 카테고리의 다른 글
BFS, DFS c++ (0) | 2023.10.23 |
---|---|
c++ lower_bound upper_bound (0) | 2023.10.13 |
C++ 입출력 가속 코드 (1) | 2023.10.06 |
[STL] vector unique 함수 (0) | 2023.10.05 |
이진탐색 (1) | 2023.10.04 |