2012-01-20 7 views
2

数値メソッドのライブラリの開発の一部として、私は通常、ユニットテストを追加します。 Assert.AreEqual型のテストのほとんどは、現在のところ、このタイプのライブラリではそれを超える精度は必要ないため、小数点以下6桁までチェックします。このテストは、これまでのところ、その目的に役立っています。ユニットテストで数値精度を使用する場合

最近、同じライブラリの64ビット版で作業している間に、かなりの数の単体テストの結果が小数点以下6桁まで同じであったが、小数点以下第10桁以降で変化することがわかった。最初にこのことが分かったのはまったく別の話ですが、それらのうちのいくつかを追いかけることで、わからなかった微妙なバグはほとんど解決されませんでした。

これは、ユニットテストで数値を高精度でチェックする価値があると思われます(小数点以下10桁など)。完全精度である可能性もあります)、ライブラリの精度要件はあまり高くありません。科学/数値コードから数値を単体テストするコミュニティは、通常、ここで何をしていますか?推奨/提案/ポインタ

詳細情報:図書館ではダブル値を取り扱っています。それは金融ライブラリなどではないので、小数点は使用しません。

+2

関数が小数点以下の桁まで正しい答えを返し、関数が慎重に選択されたテストのセットを渡す必要がある場合、関数が(N + 1)番目以降のすべてをランダム化しているかどうかは関係ありません小数点以下桁数、またはシステム時間をユニット化されたポインタで割った値に等しい値を設定します。私はあなたの質問への真の答えは、 "より正確な使用"ではないと思う、それは "より良いテストケースを使用する"。 – Patrick87

+0

JUnitでは、浮動小数点比較に必要な等価度を指定できます。 – Cuga

+0

どのデータ型を使用していますか?ライブラリのために作成したもの、 'Decimal'、' Float'/'Double'?あなたが最後の2つのうちの1つであれば、私には「悪い」ニュースがあります... –

答えて

0

私はあなたの問題(量子コンピュータを使用しないで)のための解決策が存在するとは思わない。私が聞いた2つの可能性があります。

  1. あなたは有限表現(合理的であり、それらに基づくものすべて)を扱っています。この場合、これらの表現を完全精度で単純に比較/テストすることができます。

  2. 表現は有限ではありません(非合理的で、すべてがそれらに基づいています)。この場合は、限られた量のメモリがあるため完全な精度で操作(テストを含む)を行うことはできません。操作の精度を選択してから、その精度までしかテストすることができません。あなたは代数/シンボリック計算ではなく、値の計算を使用している

も ​​'の間の' ものがあります。実際には 'pi'、 'e'、 'sqrt(3)'のような有限表現を使用しています。そしてそれは、しかし、あなたの計算過程は#2を介してつながるため、すべてその限界に

を持っているあなたは、入力と出力は#1からのものSQRT(4)を計算するなどの操作を、行う#1

  • にあなたをもたらします

  • 関連する問題