代码之家  ›  专栏  ›  技术社区  ›  Finglas

由于0.000000001f不稳定,单元测试失败

  •  4
  • Finglas  · 技术社区  · 15 年前

    矢量为0.000000001f,因此测试失败。

    在我的头脑中做逻辑是-1.0f,-1.0f,但当我编写代码通过测试(使用内置向量方法)时,答案返回为-0.999999999f,-0.999999999f,这仍然是“正确的”。

    顺便说一下,这是c(XNA框架提供的vector2类),所以我尝试向向量的x和y参数中的每个参数添加epsilon值,但这不起作用。

    我看到的是,通过对答案进行编码,我正在编写生产代码。例如,它是相同的。当然这是不对的。

    有什么建议吗?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Community Mr_and_Mrs_D    7 年前

    请看我的答案 here .

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

        2
  •  6
  •   Darin Dimitrov    15 年前

    单元测试框架通常为具有精度的浮点提供断言。例如,在Visual Studio测试中,您可以编写:

    Assert.AreEqual(1.0f, 0.9999999999f, 1e-3); // passes
    Assert.AreEqual(1.0f, 0.9f, 1e-3); // fails
    
        3
  •  1
  •   schnaader    15 年前

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

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

    而不是

    if (TestSomething()->Vector.x = 1.0f) return true;
    
        4
  •  0
  •   Michael    15 年前

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

    尝试将epsilon值添加到向量上是行不通的-您仍然会遇到同样的精度问题。

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

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