Gaming Life

一日24時間、ゲームは10時間

C++で浮動小数点の誤差を考慮して等価比較する

<cfloat>ヘッダ中にあるDBL_EPSILONを使えば誤差も考慮して2つのdouble値の等価比較ができる。

float型ならFLT_EPSILONを使えばよい。

#include <cmath>
#include <cfloat>

//double型のaとbを誤差考慮して比較する
bool NearlyEqual(double a, double b)
{
    return abs(a - b) < DBL_EPSILON;
}

int main()
{
    double a,b;

    if(NearlyEqual(a,b))
    {
        return 0;
    }

    return 1;
}

追記(11/07) 故あってUE4の数学ライブラリ読んでたら似たような関数があったので、それに習って書き換えてみる。

struct Math
{

    static constexpr bool NearlyEqual(const float a, const float b, const float err = FLT_EPSILON)
    {
        return Abs<float>(a - b) <= err;
    }

    static constexpr bool NearlyEqual(const double a, const double b, const float err = DBL_EPSILON)
    {
        return Abs<double>(a - b) <= err;
    }

    template<typename T>
    static constexpr inline T Abs(const T a)
    {
        return (a >= (T)0) ? a : -a;
    }
};