문제발견
"BOJ 25206번: 너의 평점은" 문제를 풀다가 이상한 점을 발견했다.
score_float[i] 값에 0.1의 값이 들어있음에도 불구하고 31번줄의 if절이 실행되지 않았다.
나와 같은 문제를 풀다가 여기까지 왔으면 몰라도 그렇지 않다면 문제를 읽고 코드를 이해하기는 너무 귀찮으므로 발생한 문제를 간략한 코드로 나타내면 다음과 같다.
#include <iostream>
using namespace std;
int main(){
float a = 0.1;
if(a == 0.1) cout << "a는 0.1 입니다.";
else cout << "a는 0.1이 아닙니다.";
cout << endl;
return 0;
}
아주 기가 찰 노릇이다. 왜 이런 오류가 발생했을까?
문제 원인
원인을 찾기 위해 변수 a를 소수점 14자리까지 출력했더니...
#include <iostream>
using namespace std;
int main(){
float a = 0.1;
cout<<fixed; // 추가한 부분 시작
cout.precision(14);
cout << a << endl;
cout << endl; // 추가한 부분 끝
if(a == 0.1) cout << "a는 0.1 입니다.";
else cout << "a는 0.1이 아닙니다.";
cout << endl;
return 0;
}
0.1인줄만 알았던 것이 0.1이 아니였다! 소수점 뒤쪽에 쓰레기값이 들어있었다...
이는 이진수로 실수를 표현해야하는 C와 C++의 어쩔 수 없는 한계라 해결할 방법이 아직까지는 없다고 한다.
비교 결과값이 같은 다른 조건 형식이 있다면 그걸로 비교를 하도록 하자...
(만약 소수점을 지정해서 출력하는 방법을 알고 싶다면 밑의 글을 참고하도록 하자.)
'코딩 팁' 카테고리의 다른 글
[C/C++] 실수형 자료 소수점 지정해서 출력하기 (0) | 2023.06.08 |
---|---|
[오류] 세그멘테이션 오류 (core dumped) 해결 방법 (0) | 2023.06.05 |