由于0.000000001的不准确性导致单元测试失败

时间:2009-05-27 21:29:25

标签: c# unit-testing

向量超出0.000000001f,因此测试失败。

在我脑海中执行逻辑 - 1.0f,-1.0f但是当我编写代码以通过测试时(使用内置的Vector方法),答案又回复为-0.999999999f,-0.999999999f仍然是'正确的'。

顺便提一下,这是C#(由XNA框架提供的Vector2类),所以我尝试为每个x和y参数添加一个epsilon值,但这不起作用。

我看到的方式是通过编写答案,我正在编写生产代码。例如。它会是一样的。当然这不是正确的。

有什么建议吗?

4 个答案:

答案 0 :(得分:6)

单元测试框架通常为需要精确的浮点数提供断言。例如,在Visual Studio Test中,您可以编写:

Assert.AreEqual(1.0f, 0.9999999999f, 1e-3); // passes
Assert.AreEqual(1.0f, 0.9f, 1e-3); // fails

答案 1 :(得分:2)

请参阅我的回答here

这不是关于C#,但适用相同的逻辑。

答案 2 :(得分:1)

使用epsilon值应该可行,您可以发布不起作用的代码以使您的问题更清晰。你应该这样做:

if ((TestSomething()->Vector.x - 1.0f) <= EPSILON) return true;

而不是

if (TestSomething()->Vector.x = 1.0f) return true;

答案 3 :(得分:0)

浮点数可能存在精度问题,除了与0比较之外,您很少想使用==来比较两个浮点数。

尝试向矢量添加epsilon值将不起作用 - 您仍然会遇到相同的精度问题。

相反,您需要查看两者之间的差异是否低于某个阈值:

if (Math.Abs(x - y) < epsilon)
{
     // Equal!
}