大数的操作

时间:2013-07-18 09:38:54

标签: matlab largenumber

我有一些数字a_i(对于i = 1到10000)。 我需要使用matlab计算exp(a_i)/ sum(exp(a_j))。

当然,不可能马上计算。我找到了一些技巧,最有趣being

  

“假设我们想要找到exp(7.0873e002)。这确实是一个很大的数字,但仍然只是在matlab的直接计算能力范围内。但是,我们可以找到单独的指数和尾数,而不需要调用'exp'作为如下:

 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 个答案:

答案 0 :(得分:3)

您的答案位于FD。由于您的a远远大于示例a(即e5 vs e2),他们声明的范围几乎不在Matlab的范围内,因此您的inf必须远远超出范围因此成为D。但这并不重要,因为Fexp(a)保留了您的答案,您不应该针对exp(a)进行检查,该示例仅计算exp以进行演示概念证明。但是这段代码的重点是为您提供一种查找巨型数字D = 307797 的方法。

在你的情况下,你得到

F =

    3.374110424643062 % Use format long

3.374110424643062e+307797

因此您的答案是{{1}}