我在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