我希望能够比较两个双打忽略一个可能的精度损失。 有没有一种方法已经是处理这种情况?
如果没有,是否有阈值/准则知道多少是两个双打之间的适当等价?
我希望能够比较两个双打忽略一个可能的精度损失。 有没有一种方法已经是处理这种情况?
如果没有,是否有阈值/准则知道多少是两个双打之间的适当等价?
阈值是完全依赖于问题本身。 对于一些问题,你可能会考虑1.001等于1.002和一些问题,你可能需要一个更小的阈值。
一般己技巧是:
Math.Abs(a - b) < some_epsilon // `a` is roughly equivalent to `b`
这方面的一个很好的,全面的选项是:
public static bool DoubleEquality(double a, double b)
{
const double epsilonValue = 1e-15;
if (double.IsNaN(a))
return double.IsNaN(b);
else if (double.IsInfinity(a))
return double.IsInfinity(b);
else if (a == 0)
return b == 0;
else
return Math.Abs(a - b) <= Math.Abs(a * epsilonValue);
}
需要注意的是Double.Epsilon是不是一个很好的小量值。 这将创建一个与你的第一个值的大小,这有助于颇有几分几分秤的ε。