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);
}
我刚刚注意到下面的代码 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);
}