안녕하세요,
재재입니다.
이번 포스팅은 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 개선