标题说明了一切:我想在matlab中计算一个带有大数字的指数,但是我得到了溢出,它只是返回无穷大。
>> 100^1000
ans =
Inf
我上次检查时,100 ^ 1000明显小于无穷大:)
答案 0 :(得分:5)
使用64位浮点运算,100^1000
为inf
,因为它大于最大可能值。如果符号数学工具箱可用,请使用vpa
或sym
来处理大数字:
sym('100^1000')
或
vpa('100^1000')
答案 1 :(得分:5)
正如丹尼尔已经指出的那样,MATLAB本身甚至输出的数字太大了。对于不同的数据类型,使用realmax
获得此数字。作为代表/使用如此庞大数字的替代方法,您可以使用相应的mantissa
和exponent
代替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]