2016-07-14 4 views
0

例:二重配列を比較するとき、丸め誤差をどのように考慮しますか?

(Actual) array: 0.0402666113, 0.2355691 
(Expected) array: 0.04027, 0.23557 

私は私の予想される配列は、実際の配列が一致するかどうかを確認するためにJUnitテストを書くことをしようとしています。上記の例では、テストは合格(つまり配列は等しい)ですが、実際にはテストは行いません。私は配列の行に沿ってメッセージを得るでしょう、期待されるインデックス0で異なった配列:0.0402666113;実際の:0.04027 '。これは数値の精度によるものと推測します。 for-loopを使用せずにこれらの配列を比較する方法はありますか?

私は現在、このラインを使用してそれらを比較しようとしている:

assertArrayEquals(expected, actual); 

私は、彼らがこのような何かをするだろうとして見てきた:これは動作するはず

final double delta = 0.0001; 
assertArrayEquals(expected, actual, delta); 

を、しかし、私が取得'メソッドassertArrayEquals(double []、double []、double)'を解決できません。私のJUnitバージョン(4.12)で使用できるのと同等のメソッドがありますか?もしそうでなければ、JUnitをIntelliJでどのように更新できますか?私はこのIDEを最近使用し始めました。

本当にありがとうございました。

+0

'assertArrayEquals'もどこかのループを使用します。 –

+0

Math.round(a/0.0001)== Math.round(b/0.0001) – copeg

+0

カスタム配列の等号を書かずにアサートするために 'boolean'を渡すのはなぜでしょうか? –

答えて

0

2つの倍数の違いを確認し、n桁の精度で比較されることを確認できます。あなたが例えば0.0402666113と0.04027を比較したい場合は、あなたのようなN = 4の条件を記述することができます。

if (Math.abs(expected[i] - actual[i]) < 1.e-4f) { 
    // Validates! 
} 
else{ 
    // Failed validation. 
} 

つまり、上の数字を使用して、それらの差の絶対値が許容値よりも低くなっているので、彼ら「等しい」とみなされる。

+0

実際、これは数値メソッドの教科書の標準的な解答です。あなたはいくらかの許容差を指定し、それに含まれる相違を受け入れる準備ができていなければなりません。 – mohsenmadi

+0

彼の質問は、浮動小数点数がデルタ値を使って比較されるべきだと彼は理解しています。彼はJUnitを使ってエレガントな方法でこれを行う方法を尋ねています。あなたの答えは、彼の質問に全く答えるものではありません。 – GhostCat