我从其他地方得到这段代码片段。据站长介绍,代码摘自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 ) );
也就是说,当 epsilon 为 5% 时,95.1 大约为 100,因为它落在 100 值(最大)的 5% 范围内。另一方面,95.1 本质上不是 100,因为 100 与 95.1(最小值)的差异不在 5% 以内。
关于algorithm - 计算机编程艺术中approximatelyEqual和essentiallyEqual的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3728783/