计算机编程艺术中近似相等和本质上的区别
Posted
技术标签:
【中文标题】计算机编程艺术中近似相等和本质上的区别【英文标题】:Difference among approximatelyEqual and essentiallyEqual in The art of computer programming 【发布时间】:2011-04-13 07:53:21 【问题描述】:我从其他地方得到这个代码 sn-p。据站长介绍,代码取自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);
【问题讨论】:
【参考方案1】:approximatelyEqual
给出a
和b
之间的差异是否小于可接受的误差(epsilon
),由a
或b
中的较大者确定。这意味着这两个值“足够接近”,我们可以说它们大致相等。
essentiallyEqual
给出a
和b
之间的差异是否小于可接受的误差(epsilon
),由a
或b
中的较小者确定。这意味着这些值的差异小于任何计算中可接受的差异,因此它们可能实际上并不相等,但它们“基本上相等”(给定 epsilon
)。
这适用于我们有数据和“可接受的错误”率等问题。这段代码只是为您提供了这些术语的算法定义。
【讨论】:
你能举一个现实世界的例子,我们应该如何在这两个函数中进行选择?This means that the values differ less than the acceptable difference in any calculation
- 如果值差异较小,这也意味着close enough
?那么,它和approximatelyEqual
有什么不同呢?
这是衡量计算是否产生良好结果的众多方法中最基本的两种。如果您依赖于人类理解的近似概念 - 近似相等的计算在依赖于人类解释的误差测量中很有用(当您关心人类是否认为您产生了错误时)。本质上相等处理软件和硬件的限制 - 当您测量计算机是否会将您的结果视为相同时很有用(计算机能够区分两个结果之间的差异吗?)
“大约”和“基本上”是艺术术语,还是 Knuth 决定为他的书赋予意义的几个词?其他人是否经常使用相同的词来指代相同的区别?
这些术语用于处理误差范围的领域,具有相同的一般区别 - 被分析的系统将基本相等的测量视为等效,而人类将近似相等的测量视为等效.区别并不总是相关的。【参考方案2】:
区别在于本质相等意味着近似相等,反之则不然。所以本质平等比近似平等强。
同样本质相等是不可传递的,但是如果a
本质上等于b
,并且b
本质上等于c
,那么a
大约等于c
(对于另一个值ε)。
【讨论】:
【参考方案3】:举个例子:
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% 以内。
【讨论】:
我可以说,instantialEqual 总是需要一个closer
值而不是approximateEqual 吗?
是的,essentiallyEqual
值总是比approximatelyEqual
值“更接近”。
想想您的常规商店的优惠以及那里的百分比意味着什么。 33% 的价格折扣和 33% 的额外免费产品哪个更有价值?解决方案是您应该更喜欢 33% 的折扣,因为这相当于 50% 的额外免费产品优惠。这里也会发生同样的情况,这取决于您是否将 epsilon 取为两个值中较大或较小的值,结果会有所不同。 66.6 大约等于 100 与 33% 的 epsilon,但仅基本等于 50% 的 epsilon。以上是关于计算机编程艺术中近似相等和本质上的区别的主要内容,如果未能解决你的问题,请参考以下文章