如何使用Bash命令计算pi

如何使用Bash命令计算pi,bash,shell,seq,bc,Bash,Shell,Seq,Bc,我正在学习bash脚本。在探索数学函数时,我遇到了一个计算pi值的命令 seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l 虽然我了解基本的seq命令是如何工作的,但我无法理解上面的命令是如何工作的。有人能澄清一下它是如何工作的吗 seq -f 4 %g 1 2 99999 提供以下数据: 4/1 4/3 4/5 ... 4/9999 “粘贴”命令获取此列表,并在前两个列表之间插入-,在后两个列表之间插入+等(并将其放在一行上,因此): 这是π

我正在学习bash脚本。在探索数学函数时,我遇到了一个计算pi值的命令

seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l
虽然我了解基本的seq命令是如何工作的,但我无法理解上面的命令是如何工作的。有人能澄清一下它是如何工作的吗

seq -f 4 %g 1 2 99999 
提供以下数据:

4/1
4/3 
4/5 
...
4/9999
“粘贴”命令获取此列表,并在前两个列表之间插入-,在后两个列表之间插入+等(并将其放在一行上,因此):


这是π的近似值。“bc”程序计算并打印π值。

此程序使用Gregory–Leibniz级数计算π值:

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
执行算法以给出结果


编辑:如中所述,此序列收敛非常缓慢。具有显著更高的收敛速度:

对tan-1(x)使用相同的展开式:

为了计算π,我们可以看到,它仅使用级数的前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

不是您关于使用
seq
的问题的直接答案,但pi可以使用
bc
轻松计算:

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

a
是arctan,这给了pi 1000位数字。

为什么不能这么简单:
bc-l检查名为连分数的部分。@anubhava抱歉,但是,
π
不是
22/7
。我当然知道,但即使是这个
序列
也是近似值,尽管它无疑是一个更好的近似值。相关:序列收敛得非常慢。您需要1500多次迭代才能获得比22/7更好的近似值。@KeithThompson您是对的。编辑使用Machin的公式计算π,该公式收敛速度更快。你可以在末尾使用管道
sed's/$/'
,并将其更改为
scale=1001
,因为最后一个数字被篡改了,但我仍然喜欢这个答案。@mchid或者你也可以使用管道
xargs
,原因与在EOLI中删除“`”一样
BC\u LINE\u LENGTH=0 BC-l
为避免断线疯狂:
 echo "scale=1000; 4*a(1)" | bc -l