我正在学习Bash脚本编程。在探索数学函数时,我遇到了一个可以计算圆周率的命令。
seq -f '4/%g' 1 2 99999 | paste -sd-+ | bc -l
虽然我了解基本的seq命令的工作原理,但我无法理解上述命令的工作方式。请问有人可以澄清一下它是如何工作的吗?
这个程序使用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
执行算术运算以给出结果。
编辑:如评论中所述,此序列收敛非常缓慢。 Machin公式的收敛速度显着更高:
使用相同的展开式计算π,我们可以看到它仅使用系列的前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
这并不是直接回答您有关使用 seq
的问题,但是 pi 可以很容易地使用 bc
计算:
echo "scale=1000; 4*a(1)" | bc -l
a
是反正切函数,它给出了 pi 的 1000 位小数。
sed 's/.$//'
并将其更改为 scale=1001
,因为最后一位数字会被篡改,但我仍然喜欢这个答案。 - mchidxargs
管道,以便在行尾处摆脱 \
。 - Vadim A. Misbakh-SoloviovBC_LINE_LENGTH=0 bc -l
以避免行的混乱换行:https://unix.stackexchange.com/questions/365510/how-to-avoid-wrapping-in-bc-output - Ciro Santilli OurBigBook.comseq -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"程序可以计算并输出该值。
当你真正需要一些甜蜜的圆周率数字时:
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 上测试通过。
bc -l <<< 'scale=5; 22/7'
? - anubhavaπ
不是22/7
。 - devnullseq
也是近似值,虽然毫无疑问它更好。 - anubhava