向量超出0.000000001f,因此测试失败。
在我脑海中执行逻辑 - 1.0f,-1.0f但是当我编写代码以通过测试时(使用内置的Vector方法),答案又回复为-0.999999999f,-0.999999999f仍然是'正确的'。
顺便提一下,这是C#(由XNA框架提供的Vector2类),所以我尝试为每个x和y参数添加一个epsilon值,但这不起作用。
我看到的方式是通过编写答案,我正在编写生产代码。例如。它会是一样的。当然这不是正确的。
有什么建议吗?
答案 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!
}