Che*_*eng 11 algorithm floating-point pseudocode approximation
我从其他地方得到了这段代码片段.根据网站管理员的说法,代码是从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);
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*eas 14
举个例子:
double a = 95.1, b = 100.0;
assert( approximatelyEqual( a, b, 0.05 ) );
assert( !essentiallyEqual( a, b, 0.05 ) );
Run Code Online (Sandbox Code Playgroud)
也就是说,当epsilon为5%时,95.1约为100,因为它落在100值(最大值)的5%范围内.另一方面,95.1基本上不是100,因为100与95.1(最小值)的差异不在5%之内.
pal*_*wim 10
approximatelyEqual
给出a
和之间的差值是否b
小于可接受的误差(epsilon
),由a
或者较大的确定b
.这意味着这两个值"足够接近",我们可以说它们大致相等.
essentiallyEqual
给出a
和之间的差值是否b
小于可接受的误差(epsilon
),由较小的a
或者确定b
.这意味着值的差异小于任何计算中的可接受差异,因此它们可能实际上并不相等,但它们"基本上相等"(给定epsilon
).
这适用于我们有数据和"可接受的错误"率等问题.此代码仅为您提供这些术语的算法定义.
区别在于本质相等意味着近似相等,反之则不然。所以本质相等强于近似相等。
本质相等也不是可传递的,但如果a
本质上等于b
,并且b
本质上等于c
,则a
大约等于c
(对于 epsilon 的另一个值)。