【问题标题】: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);
}

【问题讨论】:

    标签: algorithm floating-point pseudocode approximation


    【解决方案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。
      猜你喜欢
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-09
      相关资源
      最近更新 更多