我有点困惑,无法解释这种行为:

Vector3 k = new Vector3(Mathf.NegativeInfinity, Mathf.NegativeInfinity,Mathf.NegativeInfinity);
Debug.Log(k==k); // evaluates to False

尽管
Debug.Log(Mathf.Mathf.NegativeInfinity == Mathf.Mathf.NegativeInfinity)
// evaluates to True as expected

我正在使用Unity版本5.3.5f1。

最佳答案

从Unity的documentation中,==返回“对于真正接近相等的向量为true”。但是,当对x,y,z使用负无穷大初始化Vector时,此实现会产生问题。

让我们看看如何为==定义Vector3:

public static bool operator == (Vector3 lhs, Vector3 rhs) {
    return Vector3.SqrMagnitude (lhs - rhs) < 9.999999E-11;
}

在执行SqrMagnitude之前,它将首先执行lhs - rhs,因此让我们看一下-的定义方式:
public static Vector3 operator - (Vector3 a, Vector3 b) {
    return new Vector3 (a.x - b.x, a.y - b.y, a.z - b.z);
}

但是,由于a.x,b.x ...等,这对于正常数字是很好的。如果是Mathf.NegativeInfinity,则减法将导致NaN。现在,当它执行sqrMagnitude时:
public float sqrMagnitude {
    get {
        return this.x * this.x + this.y * this.y + this.z * this.z;
    }
}

这也将返回NaN

docs中,我们注意到以下内容:



因此,当我们回到此代码时:
return Vector3.SqrMagnitude (lhs - rhs) < 9.999999E-11;

它简化为return NaN < 9.999999E-11;,它将按照文档中的说明返回False

另外,Debug.Log(Mathf.Mathf.NegativeInfinity == Mathf.Mathf.NegativeInfinity)表现出预期效果的原因已记录为here

09-07 17:47