计算机编程艺术中近似相等和本质上的区别

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 给出ab 之间的差异是否小于可接受的误差(epsilon),由ab 中的较大者确定。这意味着这两个值“足够接近”,我们可以说它们大致相等。

essentiallyEqual 给出ab 之间的差异是否小于可接受的误差(epsilon),由ab 中的较小者确定。这意味着这些值的差异小于任何计算中可接受的差异,因此它们可能实际上并不相等,但它们“基本上相等”(给定 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。

以上是关于计算机编程艺术中近似相等和本质上的区别的主要内容,如果未能解决你的问题,请参考以下文章

从计算的本质到编程语言

多处理器编程的艺术-并行程序设计

梦断代码读书笔记 6

编写程序:计算π的近似值,π的计算公式为

编写程序:计算π的近似值,π的计算公式为

编程练习