Mathf.roximate(0.0f,float.Epsilon)== true是否正确?

Alb*_*que 4 c# floating-point precision floating-accuracy unity-game-engine

我刚刚注意到以下代码返回true:

Mathf.Approximately(0.0f, float.Epsilon); // true
Run Code Online (Sandbox Code Playgroud)

我已阅读Mathf.aboutly文档,其中指出:

roximately()比较两个浮点数,如果两个浮点数彼此之间的距离较小(Epsilon),则返回true。

Mathf.Epsilon文件指出:

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

结果,我运行了以下代码,期望它是false,但它也会返回true

Mathf.Approximately(0.0f, 2.0f * float.Epsilon); // true
Run Code Online (Sandbox Code Playgroud)

顺便说说:

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
Run Code Online (Sandbox Code Playgroud)

问:基于这些证据,我可以放心地说,Mathf.Approximately根据其文档*,它没有正确实施吗?

(*因此,我应该转到其他解决方案,例如C#的浮点比较函数中的解决方案)

Men*_*yus 5

Here is the decompiled code of Unity's public static bool Mathf.Approximately(float a, float b); You can see the * 8.0f at the end ^^, so a truely badly documented method indeed.

/// <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);
}
Run Code Online (Sandbox Code Playgroud)