用matlab精度处理大数

时间:2018-12-28 07:43:33

标签: matlab precision

当我尝试解决欧拉16号项目时遇到了这个问题。

问题为:

  

2 15 = 32768,其位数之和为3 + 2 + 7 + 6 + 8 = 26。

     

数字2 1000 的数字总和是多少?

我试图用MATLAB处理它。这是我的代码:

function [sum] = power_digit_sum_p16(pow)
    sum = 0;
    n = 2 ^ pow;
    M = zeros(1,301);
    for i = 301 : -1 : 0
        a = floor(n / 10 ^ i);
        M(302 - i) = a;
        sum = sum + a;
        n = n - 10 ^ i * a;
    end
end

(其中301代表2位数为1000的301位数字)

当我运行pow_digit_sum_p16(1000)时,MATLAB返回了1285,这是错误的。

然后,当我得知有问题时,我检查了MATLAB提供的数字,该数字存储在矩阵M中。

2 ^ 1000的最后一位应该是6而不是2(它遵循2-4-8-6-2-4-8-6模式)!我不明白MATLAB在这里发生了什么,但是我猜想是由于数字太大而出现问题的,因为当pow很小时,我的函数可以正常工作。

我的朋友为我提供了Python解决方案,看来python处理得很好。以下是Python中的代码:

x=2**1000
ans=0
while x>0:
    ans+=(x%10)
    x=x//10
print(ans)

更新:感谢OmG的回答,我对代码做了一些更改:

function [sum] = power_digit_sum_p16(pow)
    sum = 0;
    n = 2 ^ pow;
    n = sym(n);                     % This line is new!
    M = zeros(1,301);
    for i = 301 : -1 : 0
        a = floor(n / (10 ^ i));
        M(302 - i) = a;
        sum = sum + a;
        n = n - (10 ^ i) * a;
    end
end

我得到了我所期望的。请注意,sym函数需要符号数学工具箱。

1 个答案:

答案 0 :(得分:1)

一种解决方案是使用符号工具。例如,要找到2^100010的其余部分的真实值,您可以像下面这样进行操作:

x = sym('2^1000');
reminder = fix(double(mod(x,10)))

答案是:

 reminder = 
 6

对于1001000分别是67376