Difference among approximatelyEqual and essentiallyEqual in The art of computer programming

人走茶凉 提交于 2019-12-06 19:27:20

问题


I get this code snippet from some where else. According to the webmaster, the code is picked from The art of computer programming by Knuth

Since I do not have a copy of that book, may I know what is the difference among the two functions?

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);
}

回答1:


To give an example:

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

That is, with epsilon being a 5%, 95.1 is approximately 100, as it falls within the 5% margin of the 100 value (biggest). On the other hand, 95.1 is not essentially 100, as 100 is not within a 5% difference from 95.1 (smallest value).




回答2:


approximatelyEqual gives whether the difference between a and b is smaller than the acceptable error (epsilon), determined by the larger of a or b. This means that the two values are "close enough", and we can say that they're approximately equal.

essentiallyEqual gives whether the difference between a and b is smaller than the acceptable error (epsilon), determined by the smaller of a or b. This means that the values differ less than the acceptable difference in any calculation, so that perhaps they're not actually equal, but they're "essentially equal" (given the epsilon).

This has applications in issues where we have data and "acceptable error" rates and such. This code just gives you an algorithmic definition of those terms.




回答3:


The difference is that essential equality implies approximate equality, but not vice versa. So essential equality is stronger than approximate equality.

Also essential equality is not transitive, but if a is essentially equal to b, and b is essentially equal to c, then a is approximately equal to c (for another value of epsilon).



来源:https://stackoverflow.com/questions/3728783/difference-among-approximatelyequal-and-essentiallyequal-in-the-art-of-computer

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!