6

gtest テストを含む c++ プロジェクトを、nunit テストを含む ac# プロジェクトに移植しました。現在、浮動小数点の精度に問題があります。

nunitテストでは、私は大丈夫ではありません(赤)

Assert.AreEqual(0.7, 7 * 0.1); 

私が持っているgtestテストで:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

大丈夫です(緑)

今の質問はなぜですか???

4

4 に答える 4

5

Google TestASSERT_DOUBLE_EQ()は、実際の値が予想される値の 4 ULP 以内であることを検証します (詳細については、https://github.com/google/googletest/blob/main/docs/advanced.md#floating-point-comparisonを参照してください)。Nunit はおそらく正確な比較を行っています。

于 2010-11-10T22:08:14.957 に答える
3

または、ここで読むことができるように、2 つの値の最大差である 3 番目のパラメーターを追加することもできます。

public static void AreEqual (
    double expected,
    double actual,
    double delta
)

指定された 2 つの double が等しいか、互いに指定された精度の範囲内であることを検証します。互いに指定された精度の範囲内にない場合、アサーションは失敗します。

于 2010-08-25T10:38:26.527 に答える
1

浮動小数点数が等しいかどうかを比較することは決してありません!10進数の小数(0.1など)は、小さな精度が失われない限り、IEEEフロートに表すことはできません。0.7のように見えるかもしれませんが、0.6999999か何か他のものかもしれません。その時、それらは異なる数です。イプシロン手法を使用する必要がありますa == b if abs(a - b) <= epsilon。イプシロンが非常に小さい定数である場合を考慮してください。

これと他の多くを読んでください^

http://docs.sun.com/source/806-3568/ncg_goldberg.html

==を使用してJavaのfloatを比較することの何が問題になっていますか?

于 2010-08-25T10:31:57.337 に答える
0

代わりに float を比較する場合は、Assert.AreAboutEqualを試してください。

于 2010-08-25T10:38:37.633 に答える