这是针对二进制和原始专家的。我正在实现一个浮点 R3 向量结构,我对“平等”的定义实际上是“基本上平等”。具体来说,对于比较向量 Abs( (a[i] - b[i]) / (a[i] + b[i]) ) < .00001 的所有坐标,返回 true。
private static bool FloatEquality(float a, float b)
{
if (a == b)
{
return true;
}
else
{
float e;
try
{
e = (b - a) / (b + a);
}
catch (DivideByZeroException)
{
float g = float.Epsilon;
e = (b - a) / g;
}
//AppConsole.AppConsole.Instance.WriteLine(e);
if (e < .00001f && e > -.00001f)
{
return true;
}
else
{
return false;
}
}
}
我的问题是确定是否有一种方法可以使满足此要求的向量上的哈希值相同,因为我希望能够将这些向量用作字典的“键”。
如您所见,上面的代码用于检查 3 个不同坐标的相等性。
我正在考虑从三个浮点坐标中提取字节并使用每个坐标中的中间两个。
(以下不是代码,但堆栈溢出不会让我发布它,除非我缩进它)
Vector(x,y,z):
x's float byte[] = [ x1 x2 x3 x3 ]
y's float byte[] = [ y1 y2 y3 y4 ]
z's float byte[] = [ z1 z2 z3 z4 ]
Hash code: byte[] {x2^x3 , y2^y3, z2 ^ z3, x2 ^ z3}
或者类似的东西......简而言之 - 我很好奇如何确保适合我的 equals 方法的向量的哈希码总是相同......如果有人有一个非常低成本计算的好主意,我我很想听。或者,如果您可以将我引导到一个更深入地讨论如何存储浮点数以及如果上述比较方法返回相等的字节将始终相同的地方。
我可能需要一种新的比较方法而不是哈希函数,因为我真的无法确定任何字节都会匹配我猜...