문제발견
"BOJ 25206번: 너의 평점은" 문제를 풀다가 이상한 점을 발견했다.
25206번: 너의 평점은
인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치
www.acmicpc.net
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++] 실수형 자료 소수점 지정해서 출력하기
개요 코딩을 하다보면 실수형 자료의 소수점을 지정해서 출력해야할 때가 있을 것이다. 오늘은 C와 C++에서 어떻게 소수점을 지정해서 출력을 하는지 알아보자. C #include int main(){ float a = 0.1234567;
pink-saurus.tistory.com
'코딩 팁' 카테고리의 다른 글
[C/C++] 실수형 자료 소수점 지정해서 출력하기 (0) | 2023.06.08 |
---|---|
[오류] 세그멘테이션 오류 (core dumped) 해결 방법 (0) | 2023.06.05 |