i'm bit confused , can't explain behaviour:
vector3 k = new vector3(mathf.negativeinfinity, mathf.negativeinfinity,mathf.negativeinfinity); debug.log(k==k); // evaluates false though
debug.log(mathf.mathf.negativeinfinity == mathf.mathf.negativeinfinity) // evaluates true expected i'm using unity version 5.3.5f1.
from unity's documentation, == returns "true vectors close being equal". implementation produces problems when vector initialized negative infinity x,y,z.
let's take @ how == defined vector3:
public static bool operator == (vector3 lhs, vector3 rhs) { return vector3.sqrmagnitude (lhs - rhs) < 9.999999e-11; } before doing sqrmagnitude, first perform lhs - rhs, let's see how - defined:
public static vector3 operator - (vector3 a, vector3 b) { return new vector3 (a.x - b.x, a.y - b.y, a.z - b.z); } this fine normal numbers, however, since a.x, b.x...etc. mathf.negativeinfinity, subtraction result in nan. when sqrmagnitude:
public float sqrmagnitude { { return this.x * this.x + this.y * this.y + this.z * this.z; } } this return nan.
from docs, note following:
- if either operand nan, the result false operators except !=, result true.
therefore, when go code:
return vector3.sqrmagnitude (lhs - rhs) < 9.999999e-11; it simplifies return nan < 9.999999e-11; return false stated in docs.
also, reason why debug.log(mathf.mathf.negativeinfinity == mathf.mathf.negativeinfinity) behaves expected documented here.
- negative , positive zeros considered equal.
- a negative infinity considered less other values, but equal negative infinity.
- a positive infinity considered greater other values, equal positive infinity.
Comments
Post a Comment