【发布时间】:2010-10-09 12:23:43
【问题描述】:
众所周知,用== 比较浮点数通常是错误的。在我编写的一个 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 和其他特殊值是可能的,但不太可能,如果这很重要的话。
【问题讨论】:
-
我知道这是不相关的,但是如果你的向量真的很大,计算两个向量之间的距离以查看它们是否相等是行不通的。计算相对距离总是最好的:最好是 (d2-d1)/(d1+d2)
-
大卫:是的,但我认为你的想法对于非常小的向量(接近于零)是失败的,这是我程序中更重要的极端情况。
-
未来读者请注意:这可能会有所帮助:codercorner.com/RadixSortRevisited.htm