2013-07-18 4 views
4

У меня есть некоторые числа a_i (для i = 1 до 10000). Мне нужно вычислить exp (a_i)/sum (exp (a_j)) с помощью matlab.Операции с большими номерами

Конечно, невозможно сразу вычислить. Я нашел несколько трюков, наиболее интересные being:.

«Предположим, что мы хотим, чтобы найти ехр (7.0873e002) Это будет большое количество действительно, но все еще только едва в способности от Matlab прямого вычисления Однако, мы можем. найти отдельный показатель и мантисса без вызова на «ехр» следующим образом:

a = 7.0873e2; 
x = a/log(10); 
D = floor(x); % D will be an integer 
F = 10^(x-D); % F will lie in 1 <= F < 10 

Then D will be the power of ten and F the mantissa 

F = 6.27376373225551 % The mantissa 
D = 307 % The exponent (power of ten) 

Compare that with the direct answer: 

exp(a) = 6.273763732256170e+307" 

Я пытался что-то подобное, но результат в мае случае Inf:

a = 7.0873e5; 
x = a/log(10); 
D = floor(x); 
F = 10^(x-D); 

exp(a) = Inf 

У кого-нибудь есть идея?

+1

Вы можете быть заинтересованы в [это] (http://www.mathworks.com/matlabcentral/fileexchange/22725-переменная прецизионная целое число арифметика) –

ответ

3

Ваш ответ в F и D. Потому что ваш a намного больше, чем пример a (т. Е. e5 против e2), который они заявляют, едва ли находится в пределах диапазона Matlab, ваш должен быть хорошо вне диапазона и, таким образом, становится inf. Но это не имеет значения, потому что D и F держите ваш ответ, вы не должны быть проверочены против exp(a), пример только вычисляет exp(a), чтобы продемонстрировать доказательство концепции. Но весь смысл этого кода - дать вам способ найти exp гигантских чисел.

В вашем случае вы получаете

D = 

     307797 

и

F = 

    3.374110424643062 % Use format long 

, таким образом, ваш ответ 3.374110424643062e+307797