2010-09-16 32 views
9

我從其他地方得到這段代碼片段。根據網站管理員,代碼摘自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); 
} 

回答

11

舉個例子:

double a = 95.1, b = 100.0; 
assert(approximatelyEqual(a, b, 0.05)); 
assert(!essentiallyEqual(a, b, 0.05)); 

即,小量爲5%,95.1是大約100,因爲它落在100值(最大)的5%的容限內。另一方面,95.1基本上不是100,因爲100與95.1(最小值)的差值不在5%之內。

+0

我可以說,基本上等於總是需要一個「接近」值大約等於? – 2010-09-16 17:03:03

+0

是的,「本質上等於」值總是比「大約等於」值「更接近」。 – palswim 2010-09-16 17:08:41

+3

想想您的常規商店的優惠以及那裏的百分比。價格33%折扣或額外免費產品33%更有價值?解決方法是,您應該更喜歡33%的折扣,因爲這相當於50%的額外免費產品優惠。同樣的情況發生在這裏,取決於你是否在兩個值中的較大或最小值附近獲得了ε,結果會有所不同。 66.6近似等於100,具有33%ε,但僅與50%ε基本相等。 – 2010-09-16 17:24:20

9

approximatelyEqual給出ab之間的差是否大於可接受的誤差(epsilon),通過ab較大確定小。這意味着這兩個值「足夠接近」,我們可以說它們大致相等。

essentiallyEqual給出ab之間的差是否大於可接受的誤差(epsilon),通過ab較小確定小。這意味着這些值在任何計算中的差異都小於可接受的差異,因此它們可能並不相等,但它們「基本相等」(給定epsilon)。

這有應用程序在我們有數據和「可接受的錯誤」率等問題。這段代碼只是給你一個這些術語的算法定義。

+0

你能舉一個真實世界的例子,我們應該如何選擇這兩個功能? – 2010-09-16 16:56:14

+0

'這意味着這些值的差異小於任何計算中的可接受差異 - 如果這些值不同,那麼這也意味着'足夠接近'?那麼,它與「approxEqual」有什麼不同呢? – 2010-09-16 16:59:56

+0

這是一個[醫療文章](http://www.pnas.org/content/95/3/811.full),它同時使用了這兩個術語。這不一定如何選擇,但它也是如何描述數據。 – palswim 2010-09-16 17:05:18

3

不同之處在於基本平等意味着近似平等,但反之亦然。所以基本平等比近似平等更強。

另外必要平等是不傳遞的,但如果a基本上等於b,和b基本上等於c,然後a近似等於c(對於小量的另一值)。

+0

+1用於傳遞分析 – 2014-04-23 18:26:56