如何在没有inf的情况下在matlab中计算指数?

时间:2014-08-27 17:15:44

标签: matlab numeric numerical

标题说明了一切:我想在matlab中计算一个带有大数字的指数,但是我得到了溢出,它只是返回无穷大。

>> 100^1000

ans =

   Inf

我上次检查时,100 ^ 1000明显小于无穷大:)

3 个答案:

答案 0 :(得分:5)

使用64位浮点运算,100^1000inf,因为它大于最大可能值。如果符号数学工具箱可用,请使用vpasym来处理大数字:

sym('100^1000')

vpa('100^1000')

答案 1 :(得分:5)

正如丹尼尔已经指出的那样,MATLAB本身甚至输出的数字太大了。对于不同的数据类型,使用realmax获得此数字。作为代表/使用如此庞大数字的替代方法,您可以使用相应的mantissaexponent代替base-10 representation,这是通常的MATLAB表示形式。这里列出了获取这两者的功能 -

function [mantissa, base10_exponent] = base10_mantissa_exponent(base,exponent)

act_exp = exponent*log10(abs(base));
base10_exponent = floor(act_exp);
mantissa = power(10,act_exp - base10_exponent);

if rem(exponent,2)==1 && sign(base)==-1
    mantissa = -mantissa;
end

return;

下面列出了很少的示例运行和与实际MATLAB运行验证的比较。

Ex#1

base = -125.343;
exponent = 101;
usual_approach = base^exponent
[mantissa, base10_exponent] = base10_mantissa_exponent(base,exponent)

输出 -

usual_approach =
 -8.0930e+211
mantissa =
   -8.0930
base10_exponent =
   211

Ex#2(问题中讨论的问题)

base = 100;
exponent = 1000;

输出 -

usual_approach =
   Inf
mantissa =
     1
base10_exponent =
        2000

答案 2 :(得分:1)

为了处理大数字,还有类High Precision Float,通过写作可以实现结果

a = hpf(100);
b = hpf(1000);
c = a^b;

给出了c = 1.e2000。对struct(c)的调用提供了有关如何在内部存储号码的信息。

struct(c)

ans = 

NumberOfDigits: [64 4]
   DecimalBase: 4
          Base: 10000
       Numeric: 0
          Sign: 1
      Exponent: 2001
        Migits: [1000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]