ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

floatが等しいか判定

2つのfloat値が同じかどうかは計算誤差が含まれるので通常の比較演算子で比較してはいけない。
ほぼ同じ値かどうかは、差分を取って、それがイプシロンより小さいかどうかで判定していた。
raylibのraymathチートシートをみていたところ、floatを比較する関数 FloatEquals() があった。
実際の実装は次の通り。

// Check whether two given floats are almost equal
RMAPI int FloatEquals(float x, float y)
{
#if !defined(EPSILON)
    #define EPSILON 0.000001f
#endif

    int result = (fabsf(x-y)) <= 
       (EPSILON*fmaxf(1.0f, fmaxf(fabsf(x), fabsf(y))));

    return result;
}

こちらの実装では、比較するイプシロンの値に2つの数値の絶対値の大きい方(ただし1より小さい場合は1)をかけていた。
大きな値の場合でも比較する有効桁数を変わらないようにするためかな。