본문 바로가기
C++ STL, 알고리즘

float vs double c++ 부동소수점 문제

by wanna_dev 2023. 10. 12.

코딩 테스트 문제를 풀던 중 나누기 연산을 해야하는 문제가 있었다.

나누기 연산 후 소수점 아래 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언어 실수 자료형 정리 : float, double, long double, 부동소수점/형변환

C언어 실수형 타입 : float, double, long double 이번 글에서는 C언어와 C++의 실수형 자료 타입인 float, double, long double 자료형에 대해서 살펴보겠습니다. 우선, 세 자료형의 바이트 수와 표시 가능 범위

jimmy-ai.tistory.com

https://aeapa.tistory.com/31

 

[C언어] 실수 자료형, double 을 사용하는 이유

C언어 실수 자료형, double 을 사용하는 이유 실수는 크기에 따라 float, double, long double 로 구별하며, 값을 저장할 수 있는 범위가 다릅니다. 가장 작은 float도 4바이트이므로 저장 범위가 큰 편입니

aeapa.tistory.com

https://codingdog.tistory.com/entry/c%EC%96%B8%EC%96%B4-double%ED%98%95-vs-float%ED%98%95-%EC%96%B4%EB%96%A4-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EC%9E%88%EC%9D%84%EA%B9%8C%EC%9A%94

 

c언어 double형 vs float형 : 어떤 차이가 있을까요?

저번에 부동 소수점에 대한 이야기를 했었습니다. 그러면 C언어에서 double과 float의 차이는 무엇일까요? 정밀도 차이입니다. 그리고 오차 범위도 차이가 날 수 밖에 없는데요. 저는 이 두 가지를

codingdog.tistory.com

 

'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