我已经阅读了大量关于浮动误差和浮动近似等的内容。
问题是:我从未读过现实世界问题的答案。今天,我遇到了一个现实世界的问题。而且这真的很糟糕,我真的不知道如何逃脱。
看看这个例子:
[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
。
大多数时候,这不是问题。功能是连续的,一切都很好,结果有点偏离。
但是在这里,我们有一个不连续的函数,而且误差非常非常大。测试恰好在不连续点上失败。
如何处理不连续函数的舍入误差?