double
値は、明示的な精度 (イプシロン) を使用して不正確に比較した方が優れていることが知られています。たとえば、2 つの引数assertEquals(double,double)
は、この理由で から非推奨になりましたjUnit
。
しかし、Matrix や Vector などの複合クラスがある場合はどうでしょう。それを比較するためにどのように実装することをお勧めしますか? 標準equals()
は、正確な比較のみを期待しています。これについて何らかの慣習はありますか?
double
値は、明示的な精度 (イプシロン) を使用して不正確に比較した方が優れていることが知られています。たとえば、2 つの引数assertEquals(double,double)
は、この理由で から非推奨になりましたjUnit
。
しかし、Matrix や Vector などの複合クラスがある場合はどうでしょう。それを比較するためにどのように実装することをお勧めしますか? 標準equals()
は、正確な比較のみを期待しています。これについて何らかの慣習はありますか?
従来、この equals()
メソッドは、2 つのオブジェクトが「等しい」かどうかを、数学的等価性のプロパティ (再帰プロパティなどを渡すなど) によって判断するために使用されます。double を含む行列やベクトルを使用している場合、2 つの行列または 2 つのベクトルが再帰的であるかどうかを判断するのが難しい可能性があります。isSimilar()
この場合、メソッドまたは を作成する方が良いかもしれません isAproximatlyEqual()
(幾何学的な類似性との混乱がないため、個人的には 2 番目のメソッドが好きです)。こうすることで、2 つの double を比較するときに x の誤差の範囲を許容し、 equals()
従来の等式の方法を維持することができます。そして、本当に凝りたい場合は、これらのメソッドのパラメーターとして許容誤差を追加できます。
`
boolean isAproximatlyEqual(double d1, double d2) {
isAproximatlyEqual(d1, d2, 0.001);
}
boolean isAproximatlyEqual(double d1, double d2, double margin) {
abs(d1 - d2) < margin;
}
`