在Javascript和MATLAB中计算pi - 不同的速度



我在Javascript中发现了一个关于计算pi的令人兴奋的链接: http://ajennings.net/blog/a-million-digits-of-pi-in-9-lines-of-javascript.html?utm_source=Iterable&utm_medium=email&utm_campaign=the-overflow-newsletter&utm_content=10-03-19

我从来没有用Javascript编程,但我设法使用"符号数学工具箱"将其翻译成MATLAB。这是我的代码(包含Javascript代码作为MATLAB注释行(

%% A Million Digist of Pi in 9 Lines of Javascript
% http://ajennings.net/blog/a-million-digits-of-pi-in-9-lines-of-javascript.html
% let i = 1n;
% let x = 3n * (10n ** 1020n);
% let pi = x;
% while (x > 0) {
%         x = x * i / ((i + 1n) * 4n);
%         pi += x / (i + 2n);
%         i += 2n;
% }
% console.log(pi / (10n ** 20n));

% MATLAB Code
n = 1000;   % Number of digits
k = sym(1);
x = 3 * (10^sym(n));
pi = x;
tic
while x > 1/2
x = x * k / ((k + 1) * 4);
pi = pi + x /(k + 2);
k = k +2;
end
fix(pi)
toc

我现在的问题:

为什么使用符号数学工具箱的Javascript比MATLAB更快?注意:代码使用无限整数。 换句话说:为什么Javascript的"无限数字整数"比Matlab中的符号整数快。还是不是?

在 MATLAB 中,1000 位数字需要 16 秒,并且不少于 1 秒(见链接(!

这对我来说似乎有点奇怪,因为通常 MATLAB 真的很快(我知道不是最快的(。

如果有人问自己,你到底为什么要这样做? 首先,它很有趣 - 其次:我需要MATLAB,我喜欢它

感谢您的任何回答!

符号数学工具箱用于 - 顾名思义 - 符号数学,这意味着它进行代数计算,但这需要大量计算,因此非常慢。JavaScript不使用代数计算,它只使用内置的BigInt类型。尝试在没有sym的情况下做同样的事情,你会看到它会快得多,例如你可以使用uint64整数:

n = uint64(18);   % Number of digits
k = uint64(1);
x = 3 * uint64(10)^n;
pi = x;
tic
ctr = 0
while x > 1/2
ctr = ctr + 1;
x = x * k / ((k + 1) * 4);
pi = pi + x /(k + 2);
k = k +2;
end
fix(pi)
toc

最新更新