Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 부동 소수점 값 비교하는 방법

이 글에서는 C++를 사용하여 두 개의 부동 소수점(floating point) 데이터를 비교하는 방법을 알아보겠습니다. 부동 소수점 비교는 정수 비교와는 성격이 완전히 다르기 때문에 주의가 필요합니다.

정밀도(Precision)를 고려한 비교

두 부동 소수점 값을 비교할 때는 반드시 정밀도를 함께 고려해야 합니다. 예를 들어, 두 숫자가 각각 3.1428과 3.1415라고 가정해 보겠습니다. 이 경우 0.01 수준의 정밀도까지는 두 값이 같다고 볼 수 있지만, 0.001처럼 더 세밀한 정밀도로 비교하면 서로 다른 값입니다.

이러한 기준으로 비교하려면 먼저 한 부동 소수점 숫자에서 다른 숫자를 뺀 결과의 절댓값을 구합니다. 그다음 그 결과가 허용 오차(epsilon)인 정밀도 값보다 작은지 확인하면 됩니다. 이 방식을 통해 두 값이 사실상 동일한지 여부를 판단할 수 있습니다.

예제 코드

#include <iostream>
#include <cmath>
using namespace std;
bool compare_float(float x, float y, float epsilon = 0.01f){
   if(fabs(x - y) < epsilon)
      return true; //두 값은 같음
      return false; //두 값은 다름
}
int main() {
   float x, y;
   x = 22.0f/7.0f;
   y = 3.1415f;
   if(compare_float(x, y)){
      cout << "두 값은 동일합니다" << endl;
   } else {
      cout << "두 값은 동일하지 않습니다" << endl;
   }
   if(compare_float(x, y, 0.001f)){
   cout << "두 값은 동일합니다" << endl;
   } else {
      cout << "두 값은 동일하지 않습니다" << endl;
   }
}

실행 결과

두 값은 동일합니다
두 값은 동일하지 않습니다

코드 설명

위 예제에서 compare_float() 함수는 세 번째 매개변수로 정밀도(epsilon)를 받으며, 기본값은 0.01입니다. 함수 내부에서는 cmath 헤더에 포함된 fabs() 함수를 사용하여 두 값의 차이에 대한 절댓값을 계산하고, 이 값이 epsilon보다 작으면 true를 반환합니다.

22/7 ≈ 3.142857이고 3.1415와의 차이는 약 0.001357입니다. 따라서 기본 정밀도 0.01로 비교하면 두 값은 동일한 것으로 판단되지만, 더 엄격한 정밀도인 0.001로 비교하면 동일하지 않은 것으로 판단됩니다.