2012-02-18 126 views
3

如何在MATLAB中執行涉及大數量的計算。舉一個簡單的例子,一個任意的精度計算器會顯示((1/120)^ 132)*(370!)/(260!)大約是1.56,但是MATLAB不能執行這樣的計算(power(120,-132)*factorial(370)/factorial(260) = NaN) 。MATLAB:涉及大數字的計算

我也曾嘗試以下,這不工作:

syms a b c d; 
a=120; b=-132; c=370; d=260; 
f=sym('power(a,b)*gamma(c+1)/gamma(d+1)') 
double(f); % produces error that instructs use of `vpa` 
vpa(f) % produces (gamma(c + 1.0)*power(a, b))/gamma(d + 1.0) 
+0

甚至達到500的遞歸限制很可能是壞的程序/算法設計的指示。爲什麼你的代碼首先需要這麼深的遞歸? – Kavka 2012-02-18 04:03:46

+0

我正在計算涉及非常大的因子和冪的數量,並且無法訪問符號數學工具箱。數量結果在一個數量級的單位內,但輸入表達式的條款要大得多。因此,我使用遞歸來評估更小步長的階乘和冪(我想我可以增加每個遞歸級別的步數,從而相應地減少所需的遞歸深度)。我也可以使用循環來評估數量,但我發現遞歸是一個更優雅的解決方案。 – user001 2012-02-18 04:11:42

+0

因式和冪可以很容易地計算而無需遞歸。如果你正在計算大的因式分解,注意雙值的Matlab變量不會精確到無法存儲它們。 – Kavka 2012-02-18 04:19:59

回答

4

如果你只是想計算的一些大數階乘,你可以使用Java任意精度的工具,就像這樣:

result = java.math.BigDecimal(1); 
for ix = 1:300 
    result = result.multiply(java.math.BigDecimal(ix)); 
end 
disp(result) 
306057512216440636035370461297268629388588804173576999416776741259476533176716867465515291422477573349939147888701726368864263907759003154226842927906974559841225476930271954604008012215776252176854255965356903506788725264321896264299365204576448830388909753943489625436053225980776521270822437639449120128678675368305712293681943649956460498166450227716500185176546469340112226034729724066333258583506870150169794168850353752137554910289126407157154830282284937952636580145235233156936482233436799254594095276820608062232812387383880817049600000000000000000000000000000000000000000000000000000000000000000000000000 

在這種情況下值result是一個java對象。你可以在這裏看到可用的方法:http://docs.oracle.com/javase/6/docs/api/java/math/BigDecimal.html

雖然我仍然不確定我是否會相信這種方法。你必須試驗一下,看看。

3

取決於你想要做的事情,那麼你可以評估你有興趣在日誌空間的表達:

log_factorial = sum(log(1:300)); 
+0

謝謝,這是一個好主意。 – user001 2012-04-04 00:01:22

1

這將工作:
vpa('120^-132*370!/260!')

,其結果是
1.5625098001612564605522837520443