Mathf.Approximately
とは?Mathf.Approximately
は、浮動小数点数(float型)の近似比較を行うUnityの関数です。
浮動小数点数の比較には誤差が伴うため、通常の ==
演算子で正確に比較するのが難しい場合があります。Mathf.Approximately
は、その誤差を考慮して「ほぼ等しい」と判断するために使われます。
public static bool Approximately(float a, float b)
a
と b
:
a
と b
が「ほぼ等しい」と判断されれば true
を返す。0.1 + 0.2
を計算しても、結果が正確に 0.3
とはならない場合があります。Mathf.Approximately
はこの誤差を吸収し、「人間が見る限り等しい」と思える範囲で比較します。float a = 0.1f + 0.2f; // 計算結果が厳密には 0.300000012f
float b = 0.3f;
if (a == b) {
Debug.Log("等しい"); // 実行されない
} else {
Debug.Log("等しくない");
}
浮動小数点数の計算誤差により、a
と b
は「等しくない」と判断されます。
Mathf.Approximately
を使用float a = 0.1f + 0.2f;
float b = 0.3f;
if (Mathf.Approximately(a, b)) {
Debug.Log("ほぼ等しい"); // 実行される
} else {
Debug.Log("等しくない");
}
Mathf.Approximately
を使用すると、a
と b
が「ほぼ等しい」と判断されます。
Mathf.Approximately
の仕組みは、2つの値の差が小さな閾値(epsilon)以下かどうかを判定しています。
return Mathf.Abs(a - b) < Mathf.Epsilon;
Mathf.Abs
:
Mathf.Epsilon
:
1.192092896e-07f
(約0.0000001)。UIの移動などで小数点が絡む計算を行う場合、座標や距離が「ほぼ等しいか」を判定する際に使用します。
if (Mathf.Approximately(pos.y, 0f)) {
pos.y = -center.y;
}
上記は、pos.y
が0に非常に近い場合に、補正を適用する処理です。
pos.y
が 0.00001 や -0.00001 のような値になる可能性がありますが、これを許容しています。bool AreAlmostEqual(float a, float b, float tolerance) {
return Mathf.Abs(a - b) <= tolerance;
}
Mathf.Approximately
は、浮動小数点の比較を簡略化する便利な関数で、特に以下の場合に適しています:
浮動小数点数(float
や double
)の誤差は、コンピュータが数値を2進数で表現する仕組みと、有限のビット数による制約が原因です。
コンピュータは2進数(0
と 1
)で数値を扱います。しかし、10進数で表現できるすべての数値が、2進数では有限の桁数で正確に表現できない場合があります。
10進数の 0.1
を2進数で表現するとどうなるか?
0.1
は、2進数では 0.00011001100110011…(無限に繰り返す)になります。結果として、コンピュータ内部での 0.1
は 厳密な0.1ではなく、少しズレた値 になります。
浮動小数点数は、IEEE 754標準に基づいて表現されます。この形式では、数値を以下のように分解します:
32ビットの float
型では、仮数部が23ビットしかないため、正確に表現できるのは 約7桁の10進数精度 です。
浮動小数点数の演算では、結果に誤差がさらに加わる場合があります。
float a = 0.1f;
float b = 0.2f;
float c = a + b; // 結果は厳密な 0.3f ではない
0.1
や 0.2
はそれぞれ正確に表現されていないため、足し算の結果もズレます。int a = 100; // 0.1 を 100倍として扱う
int b = 200; // 0.2 を 100倍として扱う
int c = a + b; // 結果は 300(0.3 を 100倍したもの)
float tolerance = 0.0001f;
if (Mathf.Abs(a - b) < tolerance) {
Debug.Log("ほぼ等しい");
}
Mathf.Approximately
を使う
double
型を使用する
float
より精度が高い。ただし、必要以上に使うとメモリ使用量が増える。浮動小数点数の誤差は、2進数での表現の限界と有限ビット数による制約から生じます。この誤差は避けられませんが、許容範囲を設けたり整数型を使用することで多くの場面で対策可能です。
ゲーム開発では、Mathf.Approximately
や許容誤差を使った比較が特に重要です!