2016-05-31 3 views
2

私は最近、googletestを使用して開始して、私が理解できない状況に遭遇しました。テストは失敗しますが、すべてが成功するように見えます。 C++とgtestは、一見簡単なテストが失敗した理由を理解するのに役立つ必要があります

は私が持っている小さな構造体これに類似:

struct vec2 { float x, y; } 

機能:

vec2 vec2_add_scalar (vec2 v, float scalar) { 
    return {v.x + scalar, v.y + scalar}; 
} 

とテストは:

TEST (math_test, add_scalar) { 
    vec2 v {4.0f, -4.0f}; 
    float s = 3.14f; 

    vec2 r = vec2_add_scalar(v, s); 

    EXPECT_EQ (7.14f, r.x); 
    EXPECT_EQ (-0.86f, r.y); 
} 

テストを実行している、これは私が得るものです:

[ RUN  ] vector2_test.add_scalar 
vec2_test.cpp: Failure 
    Expected: 7.14 
To be equal to: r.x 
    Which is: 7.14 

テストが失敗する理由を理解できず、テストが失敗する原因を突き止めるのに役立ちます。

+0

厳しいですおそらく浮動小数点コンパイラの設定? 400f、-400f、314fで動作しますか? – Bathsheba

+0

浮動小数点数学には読解と理解が必要ですが、多くの落とし穴があります。 1つの初心者のエラーは、浮動小数点を等しいと比較することです。間隔と比較する必要があります(例: EXPECT_TRUE(r.x-7.14f <δ&& r.x-7.14f> -delta)。 –

+0

"浮動小数点数学には読解と理解が必要ですが、多くの落とし穴があります"。確かに、非常に良い。 「あなたはいつもある間隔で比較すべきです」というわけではありませんが、それはホグウォッシュではなく、コメントの最初の部分で覆われていません。 – Bathsheba

答えて

2

あなたはgoogletest-AdvancedGuideで読むかもしれませんが、ASSERT_FLOAT_EQ/ASSERT_DOUBLE_EQを使用することをお勧めします...

は理由のために - SOポストこれをお読みください:正確な対Floating point inaccuracy examples

+0

すごく、ありがとう、これは理解が不足しているようです。 – qrikko

関連する問題