2012-02-18 55 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