Matlab或Octave怎么能这么快?

3
我对MatlabOctave的计算速度非常困惑。
如何能够立即给出像5^5^5^5(= 2.351*10^87,如果你想知道)这样的计算结果?
我找到了一些关于矩阵计算速度这篇文章)的结果,但没有其他相关内容。而这个并不是解释(我的(天真的)Python实现正在运行大约5分钟)。

1
你想计算 5^(5^(5^5)) 还是 ((5^5)^5)^5 = 2.351*10^87 - tom
@tom:绝对不是,这只是一个例子。 - Happy
@Happy 好的,那是关于指数部分的,但是你如何相乘两个数字呢?也就是说,你是实现自己的乘法算法还是使用 Python 的 * 运算符(a * b)? - rendon
1
5^5^5^5不是2.351 * 10<sup>87</sup>。它大约是1.3357 * 10<sup>2184</sup>。指数运算是从右向左结合的。5^5^5^5缩写为5^(5^(5^5))。((5^5)^5)^5是一个更容易计算的数字。那只是5<sup>555</sup>=5<sup>125</sup>。 - David Hammen
由于这是一个有那么多位数的数字,无论计算速度有多快,任何程序都无法打印出答案。 - Teepeemm
显示剩余8条评论
1个回答

3
5^5^5^5的计算并不需要那么多次操作。例如,在每个幂步骤中,比如说a^b,你可以计算exp(log(a)*b),这将得到相同的结果。
我并不是说这一定是Matlab的做法,而且可能存在数值精度问题。但这说明了多次幂运算并不像直接计算所暗示的那样困难。
至于数值精度:
>> format long
>> 5^5^5^5
ans =
    2.350988701644576e+087
>> exp(log(exp(log(exp(log(5)*5))*5))*5)
ans =
    2.350988701644561e+087

相对误差为:
>> 1 - (5^5^5^5 / exp(log(exp(log(exp(log(5)*5))*5))*5))
ans =
   -6.661338147750939e-015

这个与eps不是很远。


1
你可能指的是“不需要”。 - MrAzzaman
@MrAzzaman 哎呀!谢谢!! - Luis Mendo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接