如何使用Bash命令计算圆周率?

19

我正在学习Bash脚本编程。在探索数学函数时,我遇到了一个可以计算圆周率的命令。

seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l

虽然我了解基本的seq命令的工作原理,但我无法理解上述命令的工作方式。请问有人可以澄清一下它是如何工作的吗?


1
为什么它不能像这样简单:bc -l <<< 'scale=5; 22/7' - anubhava
3
请查看维基百科上名为“连分数”(Continued fractions)的部分。 - pawel7318
1
@anubhava 抱歉,但π不是22/7 - devnull
1
当然我知道,但是即使这个seq也是近似值,虽然毫无疑问它更好。 - anubhava
1
相关链接:https://superuser.com/questions/275516/how-can-i-generate-pi-to-a-given-number-of-decimal-places-from-a-script - Ciro Santilli OurBigBook.com
4个回答

25

这个程序使用Gregory-Leibniz级数计算π的值:

enter image description here

seq -f '4/%g' 1 2 99999生成以下分数:

4/1
4/3
4/5
4/7
4/9
4/11
4/13
4/15
4/17
4/19

粘贴管道paste -sd-+将分隔符-+交替组合。

最后,bc -l执行算术运算以给出结果。


编辑:如评论中所述,此序列收敛非常缓慢。 Machin公式的收敛速度显着更高:

enter image description here

使用相同的展开式计算π,我们可以看到它仅使用系列的前50项即可产生正确值的50位数字1

$ { echo -n "scale=50;"; seq 1 2 100 | xargs -n1 -I{} echo '(16*(1/5)^{}/{}-4*(1/239)^{}/{})';} | paste -sd-+ | bc -l
3.14159265358979323846264338327950288419716939937510

仅使用100个项,π的值可以精确计算超过100个数字:

$ { echo -n "scale=100;"; seq 1 2 200 | xargs -n1 -I{} echo '(16*(1/5)^{}/{}-4*(1/239)^{}/{})';} | paste -sd-+ | bc -l
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

1 圆周率Pi


那个序列收敛得非常缓慢。您需要超过1500次迭代才能获得比22/7更好的近似值。 - Keith Thompson
1
@KeithThompson 没错。这个编辑使用 Machin 公式计算 π,收敛速度 非常 快。 - devnull

20

这并不是直接回答您有关使用 seq 的问题,但是 pi 可以很容易地使用 bc 计算:

 echo "scale=1000; 4*a(1)" | bc -l

a 是反正切函数,它给出了 pi 的 1000 位小数。


1
你可以在末尾使用管道 sed 's/.$//' 并将其更改为 scale=1001,因为最后一位数字会被篡改,但我仍然喜欢这个答案。 - mchid
@mchid 或者您也可以使用 xargs 管道,以便在行尾处摆脱 \ - Vadim A. Misbakh-Soloviov
我还会添加BC_LINE_LENGTH=0 bc -l以避免行的混乱换行:https://unix.stackexchange.com/questions/365510/how-to-avoid-wrapping-in-bc-output - Ciro Santilli OurBigBook.com

7
seq -f 4 %g 1 2 99999 

提供数据:
4/1
4/3 
4/5 
...
4/9999

粘贴命令将此列表中的第一项和第二项之间插入一个“-”,将第二项和第三项之间插入一个“+”,以此类推(并将其放在一行上,如下所示):

4/1-4/3+4/5-4/7......4/9999

这是一个近似于圆周率的值。使用"bc"程序可以计算并输出该值。


-1

当你真正需要一些甜蜜的圆周率数字时:

sudo apt install pi
pi 10000000

使用time <command>对比echo "scale=10000; 4*a(1)" | BC_LINE_LENGTH=0 bc -l的基准测试:

digits pi bc
10^3 0.24s
10^4 6ms 87s
10^5 60ms
10^6 0.8s
10^7 14s

pi 命令是 CNL C++ 任意精度库的演示:https://www.ginac.de/CLN/

在 Ubuntu 22.04 和 Lenovo ThinkPad P51 上测试通过。


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