2012-01-31 23 views
2

在C使用float.h我不知道如何找到最大的數字,如果我加1答案將保持1.什麼是比FLT_EPSILON小的最大數量?

即1 + x = 1如何找到x?

+0

'EPS/2'應該做的伎倆。 – 2012-01-31 01:16:07

+2

@KerrekSB EPS/2可能滿足條件,但它不一定是最大的 – TJD 2012-01-31 01:20:08

回答

3

它取決於舍入模式。這是一個簡單的例子。假設我們的精度是4位,並且我們有某種IEEE754表示。因此,值1存儲爲1.0000   × 。下一個較大數是1.0001   × ,並且機器的ε-&小量;被定義爲兩者之間的差別,這是0.0001   ×   =   1.0000   × 。現在:

  • ε  / =   1.0000   ×   =   0.00001,和

  • &小量;  / =   1.0000   ×   =   0.000001。

當添加兩到1的一個,數量也第一重寫功率2 和舍入到分離器後4個數字。 e倖存的尾數 /  4肯定是0.0000,而倖存的尾數爲ε。  /  2是0.0000或0.0001,取決於您向上還是向下四捨五入。

只要有效所得尾數是0.0000,則可以將號碼添加到1而不改變其值。

(實際的精度是23 + 1,52 + 1和64爲單,雙和擴展雙精度浮點數)。

8

如果要 「比FLT_EPSILON較小的最大數」:

x = nextafterf(FLT_EPSILON, 0) 

如果您想要最大號碼x這樣1.0f + x == 1.0f,那麼答案取決於舍入模式,但是在默認舍入模式下,它僅僅是FLT_EPSILON/2

但是,事情並不那麼簡單。由於舍入到最近幾輪的甚至的鄰居關係,你有1.0f + FLT_EPSILON/2 == 1.0f,但方式:

(1.0f+FLT_EPSILON) + FLT_EPSILON/2 != (1.0f+FLT_EPSILON) 

所以,你可能反而要使用的x略小值:

x = nextafterf(FLT_EPSILON/2, 0) 

這將確保y+x == y任何y >= 1.0

+1

該問題使用FLT_EPSILON的非正式和錯誤定義作爲可以添加到1.0f以獲得非1.0f值的最小浮點數。正確的定義是1.0f和1.0f的繼承者之間的區別。對於這個正確的定義,候選'nextafterf(FLT_EPSILON,0)'不具有1.0f +候選== 1.0f的屬性。這不是你的錯,而是問題。 – 2013-05-09 07:54:15

+0

是的,我現在看到問題不一致。我回答了主題,但沒有給出正確答案。 – 2013-05-09 14:13:13

+0

並更新了答案以反映這兩個問題。 – 2013-05-09 14:17:56

相關問題