gtest テストを含む c++ プロジェクトを、nunit テストを含む ac# プロジェクトに移植しました。現在、浮動小数点の精度に問題があります。
nunitテストでは、私は大丈夫ではありません(赤)
Assert.AreEqual(0.7, 7 * 0.1);
私が持っているgtestテストで:
ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
大丈夫です(緑)
今の質問はなぜですか???
gtest テストを含む c++ プロジェクトを、nunit テストを含む ac# プロジェクトに移植しました。現在、浮動小数点の精度に問題があります。
nunitテストでは、私は大丈夫ではありません(赤)
Assert.AreEqual(0.7, 7 * 0.1);
私が持っているgtestテストで:
ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
大丈夫です(緑)
今の質問はなぜですか???
Google TestASSERT_DOUBLE_EQ()
は、実際の値が予想される値の 4 ULP 以内であることを検証します (詳細については、https://github.com/google/googletest/blob/main/docs/advanced.md#floating-point-comparisonを参照してください)。Nunit はおそらく正確な比較を行っています。
または、ここで読むことができるように、2 つの値の最大差である 3 番目のパラメーターを追加することもできます。
public static void AreEqual (
double expected,
double actual,
double delta
)
指定された 2 つの double が等しいか、互いに指定された精度の範囲内であることを検証します。互いに指定された精度の範囲内にない場合、アサーションは失敗します。
浮動小数点数が等しいかどうかを比較することは決してありません!10進数の小数(0.1など)は、小さな精度が失われない限り、IEEEフロートに表すことはできません。0.7のように見えるかもしれませんが、0.6999999か何か他のものかもしれません。その時、それらは異なる数です。イプシロン手法を使用する必要がありますa == b if abs(a - b) <= epsilon
。イプシロンが非常に小さい定数である場合を考慮してください。
これと他の多くを読んでください^
代わりに float を比較する場合は、Assert.AreAboutEqualを試してください。