MATLAB: вычисления с использованием больших чисел - PullRequest
3 голосов
/ 18 февраля 2012

Как можно выполнять вычисления в MATLAB, которые включают большие числа.В качестве простого примера, калькулятор произвольной точности показал бы, что ((1/120) ^ 132) * (370!) / (260!) Составляет приблизительно 1,56, но MATLAB не может выполнить такое вычисление (power(120,-132)*factorial(370)/factorial(260) =NaN).

Я также попробовал следующее, которое не работает:

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)

Ответы [ 4 ]

4 голосов
/ 18 февраля 2012

Если вы просто хотите вычислить факториал некоторых больших чисел, вы можете использовать инструменты произвольной точности 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

Я все еще не уверен, что доверю этому методу для (1e6)!. Тебе придется поэкспериментировать и посмотреть.

3 голосов
/ 19 февраля 2012

Вы можете использовать приближение Стирлинга для аппроксимации больших факториалов и упрощения выражения перед численным вычислением.

3 голосов
/ 18 февраля 2012

В зависимости от того, что вы пытаетесь сделать, тогда вы сможете оценить интересующее вас выражение в пространстве журнала:

log_factorial = sum(log(1:300));
1 голос
/ 26 ноября 2013

Это будет работать:
vpa('120^-132*370!/260!')

и результат
1.5625098001612564605522837520443

...