2009-05-27 12 views
4

ベクトルが0.000000001fを超えているため、テストに失敗しています。私の頭の中でロジックを行う0.000000001f不正確なユニットテストが失敗しました。

は-1.0f、-1.0fが、私は答えは-0.999999999fとして戻ってくる(ベクター法に建て使用)テストに合格するためにコードを書いたとき、ある-0.999999999f yeildsそれでもなお「正しい」。

途中でC#(Vector2クラスはXNAフレームワークによって提供されています)ですので、Vectorの各xとyパラメータにε値を追加しようとしましたが、これは機能しませんでした。

私はそれを見る方法は、答えをコーディングすることで、私は生産コードを書いています。例えば。それは同じだろう。確かにこれは正しいことではありません。

アドバイスはありますか?

答えて

2

私の回答hereをご覧ください。

C#とは異なりますが、同じロジックが適用されます。

0

浮動小数点数には精度が問題になる可能性があります.0との比較の他に、==を使用して2つの浮動小数点数を比較することはめったにありません。

ベクトルにイプシロン値を追加しようとしてもうまくいかない場合は、同じ精度問題に該当します。

代わりに、次の2つの間の差がある閾値を下回っているかどうかを確認する必要があります:イプシロン値を使用して

if (Math.Abs(x - y) < epsilon) 
{ 
    // Equal! 
} 
1

が動作するはずです、あなたはあなたの問題をより明確にするために動作しないコードを投稿できます。テストフレームワークは、通常提供

if ((TestSomething()->Vector.x - 1.0f) <= EPSILON) return true; 

代わりの

if (TestSomething()->Vector.x = 1.0f) return true; 
+0

違いを回避するにはMath.Abs​​()を忘れてしまいました。 – Cheeso

6

ユニットは精度を取る浮動小数点数のために主張する:あなたはこのような何かを行う必要があります。たとえば、Visual Studio Testでは、次のように書くことができます。

Assert.AreEqual(1.0f, 0.9999999999f, 1e-3); // passes 
Assert.AreEqual(1.0f, 0.9f, 1e-3); // fails 
+0

そのNUnit。コードは現時点ではアクセスできません。誰かがNUnitに何か似ているかどうか知っていますか? – Finglas

+1

はい、NUnitの概念は同じです:http://www.nunit.org/index.php?p=equalityAsserts&r=2.2.7 –

+0

乾杯、大きな助けになります。 – Finglas