0

Equals(object obj)それらを比較できるように、メソッドがオーバーライドされたベクトルクラスがあります。

public class Vector3f
{
    public float x,y,z;
    public Vector3f(float x, float y, float z)
    {
       this.x = x;
       this.y = y;
       this.z = z;
    }

    public static Vector3f operator +(Vector3f a, Vector3f b) {
        return new Vector3f(a.x + b.x, a.y + b.y, a.z + b.z);
    }

    public static Vector3f operator -(Vector3f a, Vector3f b) {
        return new Vector3f(a.x - b.x, a.y - b.y, a.z - b.z);
    }
    public override bool Equals(object obj)
    {
        Vector3f other = (Vector3f)obj;
        return x == other.x && y == other.y && z == other.z;
    }

    public override string ToString()
    {
        return String.Format("<{0},{1},{2}>",x,y,z);
    }
}

プラス演算子は、私の単体テストで期待どおりに機能します。しかし、2つのベクトルを引くと、それらは等しくないと言われます

Test 'RTTests.Testies.vector_subtraction_works' failed: 
Expected: <<1.1,0.1,0.1>>
But was:  <<1.1,0.1,0.1>>
Testies.cs(60,0): at RTTests.Testies.vector_sub_works()

特に出力値が両方の場合で同じであるため、比較が減算ではなく加算で機能している理由がわかりませんか?

編集:これのための私のテスト

    [Test]
    public void vector_addition_works()
    {
        Vector3f v1 = new Vector3f(1.0f, 1.0f, 1.0f);
        Vector3f v2 = new Vector3f(1.6f, 3.2f, 4.7f);

        Vector3f expected = new Vector3f(2.6f, 4.2f, 5.7f);
        Vector3f actual = v1 + v2;

        Assert.AreEqual(actual, expected);
    }

    [Test]
    public void vector_sub_works()
    {
        Vector3f v1 = new Vector3f(1.1f, 1.1f, 1.1f);
        Vector3f v2 = new Vector3f(0.0f, 1.0f, 1.0f);

        Vector3f expected = new Vector3f(1.1f, 0.1f, 0.1f);
        Vector3f actual = v1 - v2;

        Assert.AreEqual(actual, expected);
    }
4

3 に答える 3

2

問題は丸め/切り捨てエラーである必要があります。これは、浮動小数点演算、特に減算で常に発生します。等しいかどうかをテストするときは、a == bの代わりに、ab<SmallConstantを使用します。倍精度またはDecimalを使用することもできますが、切り捨てエラーは最終的に返されますが、あまり一般的ではなくなる可能性があります。

于 2011-03-17T03:37:09.393 に答える
1

アプリをデバッグすると、次のように表示されます。

1.1f-1.0f = 0.100000024

0.1は2進数で正確に表すことはできません。10進数で1/3を正確に書き出そうとするようなものですが、永遠に続くのでできません。これを説明し、フロートの実際の値を出力するためのコードにリンクする別の同様の質問があります

于 2011-03-17T04:09:58.083 に答える
0

フロートを使用しているため、おそらく問題が発生しています。フロートはその性質上、正確ではありません。何らかの理由でfloatを使用する必要がない限り、代わりにDecimalsを使用するようにクラスを変更します。

お役に立てれば。

于 2011-03-17T03:49:12.293 に答える