首页 > 解决方案 > 在 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 -溢出通讯&utm_content=10-03-19

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

%% 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

我现在的问题:

为什么使用 Symbolic Math Toolbox 的 Javascript 比 MATLAB 快? 注意:代码使用无限整数。换句话说:为什么 Javascript 的“无限位整数”比 Matlab 中的符号整数快。或者不是吗?

在 MATLAB 中 1000 位用了 16 秒,而且不少于 1 秒(见链接)!

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

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

感谢您的任何回答!

标签: javascriptmatlabperformancepi

解决方案


符号数学工具箱 - 顾名思义 - 符号数学,这意味着它进行代数计算,但这需要大量计算,因此非常慢。JavaScript 不使用代数计算,它只是使用内置的 BigInt 类型。尝试在没有 the 的情况下执行相同的操作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

推荐阅读