これは、バイナリおよびプリミティブのエキスパート向けです。float 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;
}
}
}
私の問題は、これらのベクトルを Dictionary の「キー」として使用できるようにしたいという事実のために、この要件を満たすベクトルでハッシュ値を同じにする方法があるかどうかを判断することです。
ご覧のとおり、上記のコードは 3 つの異なる座標で等しいかどうかをチェックするために使用されます。
3 つの float 座標からバイトを抽出し、それぞれの中間の 2 つを使用することを考えていました。
(以下はコードではありませんが、Stack Overflow ではインデントしない限り投稿できません)
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メソッドに適合するベクトルのハッシュコードが常に同じになるようにする方法に興味があります...誰かが非常に低コストの計算で素晴らしいアイデアを持っている場合、私は'ぜひ聞いてください。または、フロートがどのように格納されるか、および上記の比較メソッドが等しい場合に常に同じになるバイトについて詳しく説明している場所に私を導くことができれば.
ハッシュ関数ではなく新しい比較方法が必要になるかもしれません。バイトのいずれかが一致することを確認できる方法が本当にないからです...