Mathf.Approximately(0.0f, float.Epsilon) == true 是它的正确行为吗?

Is Mathf.Approximately(0.0f, float.Epsilon) == true its correct behavior?

我刚刚注意到下面的代码 returns 正确:

Mathf.Approximately(0.0f, float.Epsilon); // true

我已阅读 Mathf.Approximately Documentation 并指出:

Approximately() compares two floats and returns true if they are within a small value (Epsilon) of each other.

并且 Mathf.Epsilon Documentation 指出:

  • anyValue + Epsilon = anyValue
  • anyValue - Epsilon = anyValue
  • 0 + Epsilon = Epsilon
  • 0 - Epsilon = -Epsilon

因此,我 运行 以下代码,期望它是 false,但它也是 returns true.

Mathf.Approximately(0.0f, 2.0f * float.Epsilon); // true

顺便说一句:

Mathf.Approximately(0.0f, 2.0f * float.Epsilon); // true
Mathf.Approximately(0.0f, 3.0f * float.Epsilon); // true
Mathf.Approximately(0.0f, 4.0f * float.Epsilon); // true
Mathf.Approximately(0.0f, 5.0f * float.Epsilon); // true
Mathf.Approximately(0.0f, 6.0f * float.Epsilon); // true
Mathf.Approximately(0.0f, 7.0f * float.Epsilon); // true

Mathf.Approximately(0.0f, 8.0f * float.Epsilon); // false
Mathf.Approximately(0.0f, 9.0f * float.Epsilon); // false

问:根据该证据,我可以肯定地说 Mathf.Approximately 未根据其文档*正确实施吗?

(* 因此,我应该转向不同的解决方案,例如 Floating point comparison functions for C#)

应该是Mathf.Approximate(0.0f - 8.0f, float.Epsilon);。由于浮点数可以有一个非常小的浮点数,你需要减去浮点数 a 和 b 得到那个小数字并将它与 float.epsilon.

进行比较

[编辑]

有人指出 Mathf.Approximate 不需要传递 epsilon,因此 Mathf.Approximate(float a, float b) 就足够了。但是,如果您需要设置自己的阈值,可以使用上面提到的代码。

这里是Unity的反编译代码public static bool Mathf.Approximately(float a, float b); 您可以在末尾看到 * 8.0f ^^,因此确实是一个记录很差的方法。

/// <summary>
/// <para>Compares two floating point values if they are similar.</para>
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
public static bool Approximately(float a, float b)
{
   return (double) Mathf.Abs(b - a) < (double) Mathf.Max(1E-06f * Mathf.Max(Mathf.Abs(a),
       Mathf.Abs(b)), Mathf.Epsilon * 8.0f);
}