C++에서 float와 double 같은 부동소수점(floating-point) 변수를 비교하는 방식은 작업의 최종 목표에 따라 달라집니다. 부동소수점 연산은 본질적으로 미세한 오차를 포함할 수 있기 때문에, 단순히 == 연산자로 비교하면 의도치 않은 결과가 나올 수 있습니다.
세부적인 이론까지 깊이 파고들지 않으면서, 어느 정도의 계산 오차를 감수할 수 있는 간단하고 바로 실행 가능한 함수가 필요하다면 아래 코드를 사용해 보세요.
예제 코드
#include<iostream>
using namespace std;
// 허용 가능한 오차 정의
#define EPSILON 0.000001
bool areSame(double a, double b) {
return fabs(a - b) < EPSILON;
}
int main() {
double a = 1.005;
double b = 1.006;
cout << areSame(a, a);
cout << areSame(a, b);
}출력 결과
위 코드를 실행하면 다음과 같은 출력을 얻습니다.
1 0
코드 설명
이 함수는 허용 가능한 오차 범위(EPSILON)를 기준으로, 비교하려는 두 숫자의 차이가 그 임계값보다 작은지 검사합니다. 즉, 두 값의 차이가 설정한 오차 한계 안에 들어오면 '같다'고 판단하는 방식입니다.
위 예제에서는 동일한 값끼리 비교했을 때 1(참), 서로 다른 값끼리 비교했을 때 0(거짓)이 출력됩니다.
만약 훨씬 더 높은 정확도가 필요하다면, Bruce Dawson이 작성한 뛰어난 블로그 글을 참고하는 것이 좋습니다: Comparing Floating Point Numbers, 2012 Edition