Float型数値の等価比較

Unityでシューティングゲームを作成している時、敵機の位置を読み取り、その位置がある値と等しいかを確認する必要が出てきた。
何をしたかったかというと、敵機の位置により、その動きのパターンを決めたかったということ。


そこで先ず、どのように敵機の位置を把握しようとしたかというと以下の通り。 (x座標が0という条件が当てまるかの確認)

if (transform.position.x == 0.0f)

しかしこの方法だと以下のような警告が出てしまった。


こんな警告や
こんな警告がでてしまった


「Fix floating point number comparing. compare a difference with epsilon.」 「Comparison of floating point numbers can be unequal due to the differing precision of the two values.」

警告分は異なるが、記載してある内容としては、

「Floating型数値を等価比較する際はその精度の違いを考慮して、EPSILONを利用した比較をすべき」

というようなことを言っていると思う。


どうも一見同じに見える数値でも、Float型であると丸め誤差などで微妙に差が生じてしまい、全く同じにならないケースがあるようだ。

なので、Epsilonというとても小さい数値の定数を使用し、2つのFloat型数値が「おおよそ」同じが確認するということをするようだ。


そして、ググった結果、以下のようにコードを書き換えた。

if (Mathf.Approximately(transform.position.x, 0.0f))


このMathf.Approximatelyの詳しい内容は後述のリンクを参照して欲しいが、 簡単に内容を説明すると 「第一引数と第二引数の差がEPSILON(というすごい小さな値)いないかどうか」 を調べるというもの。 これを使えば同じだと想定されるFloat型数値の等価比較が誤差を気にせずできるようになる (と思う) docs.unity3d.com