我已经阅读了大量有关浮动错误和浮动近似等等的内容。
事情是:我从来没有读过现实世界问题的答案。而今天,我遇到了一个真实的世界问题。这真的很糟糕,我真的不知道如何逃脱。如何将浮点型与不连续函数结合起来?
看看这个例子:
[TestMethod]
public void TestMethod1()
{
float t1 = 8460.32F;
float t2 = 5990;
var x = t1 - t2;
var y = F(x);
Assert.AreEqual(x, y);
}
float F(float x)
{
if (x <= 2470.32F) { return x; }
else { return -x; }
}
x
应该是2470.32
。但实际上,由于舍入误差,其值为2470.32031
。
大多数情况下,这不是问题。函数是连续的,并且一切都很好,结果有一点价值。
但是在这里,我们有一个不连续的函数,错误真的很大。该测试完全在不连续点上失败。
我该如何处理不连续函数的舍入误差?
那么问题是什么?我可以想到四个潜在的问题:首先,常量8460.32将被转换为一个没有精确值的浮点数,因为该精确值不能表示为浮点数。其次,2470.32也是如此。第三,减去两个浮点数可能会导致另一个错误,第四,比较大小的代码可能不正确。四个问题中的哪一个,如果有的话,是你的实际问题? –
这个问题的答案可能会也可能不会有所帮助:http://stackoverflow.com/questions/3420009/avoid-rounding-error-floating-specifically-c –
@EricLippert从周围的浮动减去5990附近浮动8460总是精确的(“Sterbenz引理”),但是具有不同的常量,可能会有减法引起的误差。 –