首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >approximatelyEqual与essentiallyEqual在计算机编程领域的差异

approximatelyEqual与essentiallyEqual在计算机编程领域的差异
EN

Stack Overflow用户
提问于 2010-09-17 00:41:05
回答 3查看 1.5K关注 0票数 13

我从其他地方得到了这个代码片段。据网站管理员说,代码是从The art of computer programming by Knuth中挑选出来的

我没有那本书,请问这两个功能有甚麽分别呢?

代码语言:javascript
复制
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);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-17 00:57:32

举个例子:

代码语言:javascript
复制
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%内。

票数 14
EN

Stack Overflow用户

发布于 2010-09-17 00:47:30

approximatelyEqual给出ab之间的差值是否小于可接受误差(epsilon),可接受误差由ab中较大的一个确定。这意味着这两个值“足够接近”,我们可以说它们大致相等。

essentiallyEqual给出ab之间的差异是否小于可接受误差(epsilon),该误差由ab中较小的一个确定。这意味着在任何计算中,这些值的差异都小于可接受的差异,因此它们实际上可能不相等,但它们“基本上相等”(给定epsilon)。

这在我们有数据和“可接受的错误率”等问题上有应用。这段代码只是给出了这些术语的算法定义。

票数 11
EN

Stack Overflow用户

发布于 2010-09-17 00:59:30

不同之处在于,基本相等意味着近似相等,但反之亦然。因此,本质相等比近似相等更强。

本质相等也是不可传递的,但如果a本质上等于bb本质上等于c,那么a近似等于c (对于另一个epsilon值)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3728783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档