我从别的地方得到这个代码片段。据网站管理员说,代码是从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);
}

最佳答案

举个例子:

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

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

08-08 06:33