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)をかけていた。
大きな値の場合でも比較する有効桁数を変わらないようにするためかな。