안녕하세요,
재재입니다.

이번 포스팅은 c++ floating point error 개선하는 방법을 설명드릴게요.

(1) floating point error 가 발생하는 이유

공식적으로는 부동 소수점 에러라고 부릅니다.

부동 소수점 에러가 발생하는 이유는 간단히 이야기해보면,
아래와 같이 표현 할 수 있습니다.

“0.1 을 표현하려면 값을 근사할 수 밖에 없다. 근사값 : 0.100000000000001”

(2) c++ floating point error 개선 (적당히 작은 상수)

적당히 작은 상수를 사용해서,
두 값이 가까운지 판단하는 코드입니다.

#include <algorithm>
#define err 1e-9
using namespace std;
inline bool isNearAandB(double a, double b) {
    return abs(a-b) <= err;
}

(3) c++ floating point error 개선 (limits-epsilon)

(1) 의 코드를 epsilon 을 활용해서 작성해본 코드입니다.

#include <algorithm>
#include <limits>
using namespace std;
inline bool isNearAandB(double a, double b) {
    return abs(a-b) <= numeric_limits<double>::epsilon();
}

(4) c++ floating point error 응용 (threshold)

이번에는 두 숫자가 특정 threshold 내에 있으면,
가깝다고 판단하고 epsilon 오차를 반영해볼게요.

inline bool isNearAandBExpanded(double a, double b, double threshold) {
    return abs(a-b) - threshold <= numeric_limits<double>::epsilon();
}

위의 코드에 대한 부연설명을 드리자면,
a 와 b 의 gap 이 절댓값이 threshold 보다 작아도 PASS 가 됩니다.
(threshold 보다 작거나 같도록 하는게 의도)

(5) 주의

floating point err 는 컴파일러 환경에 따라 다릅니다.

Microsoft Visual Studio 와 g++ 버전 등에 따라서도 다르기 때문에,
유의하시면서 좋은 코드 작성해보시면 좋겠습니다.

c++ floating point error 개선

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다