计算机编程艺术中的近似等和基本相等之间的差异

Che*_*eng 11 algorithm floating-point pseudocode approximation

我从其他地方得到了这段代码片段.根据网站管理员的说法,代码是从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);
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 14

举个例子:

double a = 95.1, b = 100.0;
assert( approximatelyEqual( a, b, 0.05 ) );
assert( !essentiallyEqual( a, b, 0.05 ) );
Run Code Online (Sandbox Code Playgroud)

也就是说,当epsilon为5%时,95.1约为100,因为它落在100值(最大值)的5%范围内.另一方面,95.1基本上不是100,因为100与95.1(最小值)的差异不在5%之内.

  • 想想你常规商店的报价以及那里的百分比.什么是更有价值33%的折扣价格或33%的额外免费产品?解决方案是您应该更喜欢33%的折扣,因为这相当于50%的额外免费产品优惠.这里也会出现同样的情况,具体取决于您是将ε围绕两个值中的较大者还是最小值,结果会有所不同.66.6大约等于100,具有33%的epsilon,但仅基本上等于50%的epsilon. (3认同)

pal*_*wim 10

approximatelyEqual给出a和之间的差值是否b小于可接受的误差(epsilon),由a或者较大的确定b.这意味着这两个值"足够接近",我们可以说它们大致相等.

essentiallyEqual给出a和之间的差值是否b小于可接受的误差(epsilon),由较小的a或者确定b.这意味着值的差异小于任何计算中的可接受差异,因此它们可能实际上并不相等,但它们"基本上相等"(给定epsilon).

这适用于我们有数据和"可接受的错误"率等问题.此代码仅为您提供这些术语的算法定义.

  • 这些是衡量计算是否产生良好结果的两种最基本的方法.如果你依赖于人类理解的近似概念 - 近似等于的计算在误差测量中是有用的,这取决于人类的解释(当你关心人是否认为你产生了错误时).基本上等于处理软件和硬件的限制 - 当您测量计算机是否会将结果视为相同时(计算机是否能够区分两个结果?) (3认同)
  • “大约”和“本质上”是艺术术语,还是 Knuth 决定为他的书赋予意义的几个词?其他人是否通常使用相同的词来指代相同的区别? (2认同)
  • 这些术语用于处理误差范围的领域,具有相同的一般区别 - 被分析的系统将基本相等的测量视为等效,而人类将近似相等的测量视为等效。区别并不总是相关的。 (2认同)

via*_*tic 5

区别在于本质相等意味着近似相等,反之则不然。所以本质相等强于近似相等。

本质相等也不是可传递的,但如果a本质上等于b,并且b本质上等于c,则a大约等于c(对于 epsilon 的另一个值)。