检查source code给我这个(我剪下实现的范围)
bool approxEqual(T, U, V)(T lhs, U rhs, V maxRelDiff, V maxAbsDiff = 1e-5)
{
if (rhs == 0)
{
return fabs(lhs) <= maxAbsDiff;
}
static if (is(typeof(lhs.infinity)) && is(typeof(rhs.infinity)))
{
if (lhs == lhs.infinity && rhs == rhs.infinity ||
lhs == -lhs.infinity && rhs == -rhs.infinity) return true;
}
return fabs((lhs - rhs)/rhs) <= maxRelDiff
|| maxAbsDiff != 0 && fabs(lhs - rhs) <= maxAbsDiff;
}
最后一行是我们将要研究:
return fabs((lhs - rhs)/rhs) <= maxRelDiff
|| maxAbsDiff != 0 && fabs(lhs - rhs) <= maxAbsDiff;
换句话说,如果编号是要么相对不同决不该函数返回true多于不超过maxAbsDiff
所以使用0.01
的maxRelDiff
一个的maxRelDiff
OR 绝对不同因子(或1E-2
)与2(十进制)数字的精确度进行比较
并且使用maxAbsDiff
不同于0允许接近于0的数字被认为是相等的,即使相对差异更大比maxRelDiff
编辑:基本上先决定比较如何准确的必须,并选择您maxRelDiff
基于这一点,那么在什么时候决定应该在数等于0
与注释的例子:
approxEqual(1+1e-10, 1.0, 1e-10, 1e-30)
approxEqual(1+1e-10, 1.0, 1e-9, 1e-30)
这比较接近1,因此maxRelDiff
胜过这里的价值观和选择任何maxAbsDiff
(低于maxRelDiff
)不会改变任何东西
approxEqual(0, 1e-10, 1e-10, 1e-30)
approxEqual(0, 1e-9, 1e-9, 1e-30)
这比较接近0值设置为0,因此RelDiff(fabs((lhs - rhs)/rhs)
)将1和maxAbsDiff
胜过
你计算'绝对difference',并将其与对'0.10'。你不能只依靠绝对的差异,而你的'0.10'在大多数情况下都不够小。 – Arlen 2012-01-02 02:36:36
如果f1 = 0.01和f2 = 0.03,你有相当大的相对差异,但你的表达会说“他们是相同的”。 – 2012-01-02 04:02:30
为了某些代码的目的,这是我想要的行为。 – 2012-01-02 16:21:03