2012-12-31 66 views
0

我正在開發Android中的計算器應用程序。計算因子

我開發了計算器,並且除了階乘函數以外運行良好。

計算階乘的功能是:

public float factorial (float n){ 
    float ans=1; 
    for (int i=1; i<=n; i++){ 
     ans=ans*i; 
    } 
    return ans; 
} 

的問題是,直到34!我覺得我得到正確的答案。

34!=2.952328229965333E38 

然而,對於n>=35,我得到的答案

n!=Infinity 

我意識到,這是因爲浮動溢出。 如何增加float的範圍至少可以說是10^100.

謝謝。

+0

我確保這個函數的輸入n總是一個整數,不用擔心。 –

+0

爲什麼不使用遞歸循環來計算階乘? – punter

+1

使用尾遞歸是什麼意思? –

回答

2

如果你不介意絕對精度,那麼你可以使用double,它可以大到(近似) 1.8 * 10^308

如果精度值得關注,您應該使用BigDecimal或BigInteger(在這種情況下,factorial是一個整數函數,BigInteger可能會比BigDecimal更有效)。

4

您無法增加任何java基元類型的範圍,因爲它們是在JLS中設置的。 在你的情況下,你可以使用double來獲得更多的範圍,或者使用BigDecimal來獲得任意大的數字

2

對於擴展浮點範圍,使用double而不是float

如果精度是一個問題,那麼你不應該使用浮點類型。 doublefloat都沒有。去BigInteger。但在這種情況下,也解決您的問題:34 != 2.952328229965333E38而不是一個正確的答案。

+0

精度是一個問題 –

+0

然後使用'BigInteger' – kmkaplan

1

沒有必要重新發明輪子的東西就像一個階乘函數一樣簡單。

使用Google's Guava library。 Android應用如YoutubeGoogle搜索(來自Google本身)使用番石榴。

double f = DoubleMath.factorial(n); 

它接受輸入高達N = 170,超過該返回Double.POSITIVE_INFINITY