我从其他地方获取此代码段。根据网站站长的说法,代码是从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);
}
答案 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
会判断a
和b
之间的差异是否小于可接受的错误(epsilon
),由a
或{的较大者确定{1}}。这意味着这两个值“足够接近”,我们可以说它们大致相等。
b
说明essentiallyEqual
和a
之间的差异是否小于可接受的错误(b
),由epsilon
或{{}}中的较小者确定{1}}。这意味着值的差异小于任何计算中的可接受差异,因此可能它们实际上并不相等,但它们“基本上相等”(给定a
)。
这适用于我们有数据和“可接受的错误”率等问题。此代码只是为您提供这些术语的算法定义。
答案 2 :(得分:4)
区别在于基本平等意味着近似平等,反之则不然。因此,基本平等比近似平等更强。
基本同等性也不具有传递性,但如果a
基本上等于b
,b
基本上等于c
,那么a
是大约等于c
(对于epsilon的另一个值)。