计算机编程艺术中的近似等和基本相等之间的差异

时间:2010-09-16 16:41:05

标签: algorithm floating-point pseudocode approximation

我从其他地方获取此代码段。根据网站站长的说法,代码是从The art of computer programming by Knuth

中挑选出来的

由于我没有该书的副本,我可否知道这两个功能有什么区别?

bool approximatelyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) < fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

bool essentiallyEqual(float a, float b, float epsilon)
{
    return fabs(a - b) <= ( (fabs(a) > fabs(b) ? fabs(b) : fabs(a)) * epsilon);
}

3 个答案:

答案 0 :(得分:14)

举个例子:

double a = 95.1, b = 100.0;
assert( approximatelyEqual( a, b, 0.05 ) );
assert( !essentiallyEqual( a, b, 0.05 ) );

也就是说,当epsilon为5%时,95.1约为100,因为它落在100值(最大值)的5%范围内。另一方面,95.1基本上不是100,因为100与95.1(最小值)的差异不在5%之内。

答案 1 :(得分:10)

approximatelyEqual会判断ab之间的差异是否小于可接受的错误(epsilon),由a或{的较大者确定{1}}。这意味着这两个值“足够接近”,我们可以说它们大致相等。

b说明essentiallyEquala之间的差异是否小于可接受的错误(b),由epsilon或{{}}中的较小者确定{1}}。这意味着值的差异小于任何计算中的可接受差异,因此可能它们实际上并不相等,但它们“基本上相等”(给定a)。

这适用于我们有数据和“可接受的错误”率等问题。此代码只是为您提供这些术语的算法定义。

答案 2 :(得分:4)

区别在于基本平等意味着近似平等,反之则不然。因此,基本平等比近似平等更强。

基本同等性也不具有传递性,但如果a基本上等于bb基本上等于c,那么a是大约等于c(对于epsilon的另一个值)。