gpt4 book ai didi

c# - Mathf.Approximately(0.0f, float.Epsilon) == true 其行为是否正确?

转载 作者:行者123 更新时间:2023-12-01 17:43:28 25 4
gpt4 key购买 nike

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

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,但它也返回 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# 中的解决方案)

最佳答案

这里是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);
}

关于c# - Mathf.Approximately(0.0f, float.Epsilon) == true 其行为是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58599418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com