众所周知,比较浮点数==
通常是一个错误。在我写的一个 3D 向量类(带有浮点分量 X、Y、Z)中,如果两个向量的距离被认为为零,则它们被认为是相等的。
public override bool Equals(object obj)
{
if (obj == null) {
return false;
}
if (GetType () != obj.GetType ()) {
return false;
}
float d = DistSq ((Vec) obj);
return IsConsideredZero (d);
}
public float DistSq(Vec p)
{
Vec d = this - p;
return d.LengthSq ();
}
public float LengthSq()
{
return X * X + Y * Y + Z * Z;
}
private const float VEC_COMPARE_EPSILON_ABS = 1E-05f;
public static bool IsConsideredZero(float f)
{
return Math.Abs (f) < VEC_COMPARE_EPSILON_ABS;
}
到目前为止,一切正常。但是,现在我想获得向量的哈希码。我可以看到类似hash = (int)X^(int)Y^(int)Z
的东西一定会失败。
我能想到的最好的办法是:
public override int GetHashCode()
{
return 0;
}
当然,这有点糟糕。有什么方法可以获得合理的哈希码?NaN 和其他特殊值是可能的,但不太可能,如果这很重要的话。