提问人:ianmandarini 提问时间:10/29/2019 更新时间:10/29/2019 访问量:2344
是 Mathf.Approximately(0.0f, float.Epsilon) == true 它的正确行为?
Is Mathf.Approximately(0.0f, float.Epsilon) == true its correct behavior?
问:
我刚刚注意到以下代码返回 true:
Mathf.Approximately(0.0f, float.Epsilon); // true
我已经阅读了 Mathf.Approximately 文档,它指出:
Approximately() 比较两个浮点数,如果它们在彼此之间的小值 (Epsilon) 内,则返回 true。
- anyValue + Epsilon = anyValue
- anyValue - Epsilon = anyValue
- 0 + 厄普西隆 = 厄普西隆
- 0 - 厄普西隆 = -厄普西隆
结果,我运行了以下代码,期望它是 ,但它也返回 .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
没有根据其文档*正确实现吗?
(* 因此,我应该转向不同的解决方案,例如 C# 的浮点比较函数中的解决方案)
答:
-1赞
Kyle Kristopher Garcia
10/29/2019
#1
它应该是.由于浮点数可以有一个非常小的浮点数,因此您需要减去浮点数 a 和 b 才能得到这个小数并将其与 float.epsilon 进行比较。Mathf.Approximate(0.0f - 8.0f, float.Epsilon);
[编辑]
有人指出,Mathf.Approximate 不需要传递 epsilon,所以应该足够了。但是,如果需要设置自己的阈值,则可以使用上述代码。Mathf.Approximate(float a, float b)
评论
0赞
Immersive
10/29/2019
没有。 用于比较两个参数之间接近于零的差值,使用(隐藏/硬编码)阈值 。这与数字的“负数”无关。Mathf.Approximately()
Mathf.Epsilon
0赞
Kyle Kristopher Garcia
10/29/2019
我的措辞一定有问题。我没有提到数字必须是负数或“负数”数字应该是负数。我只是解释说,他应该得到两个浮动变量之间的差值,以便得到一个值,他需要将其进行比较。Mathf.Epsilon
1赞
Immersive
10/29/2019
啊。不好意思。是的。近似值是差值的比较,但函数的签名是 ,比较的阈值是硬编码的。因此,无需从 b 中减去 a,只需使用 a 和 b 作为参数即可。(compareLeft, compareRight)
0赞
Kyle Kristopher Garcia
10/29/2019
我刚刚遇到了Mathf.Approximately,我认为它需要一个epsilon。我使用我自己的近似函数,这就是为什么我认为 Mathf.Approximate 需要传递一个 epsilon。我会纠正我的答案。
9赞
Menyus
10/29/2019
#2
这是 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);
}
上一个:如何全精度打印浮点数
评论
Mathf.Epsilon == float.Epsilon
Mathf.Approximately
Mathf.Approximately
Mathf.Epsilon == float.Epsilon