【问题标题】:How can I calculate pi using Bash command如何使用 Bash 命令计算 pi
【发布时间】:2014-06-24 20:02:59
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么不能这么简单:bc -l <<< 'scale=5; 22/7'
  • 检查Wiki 部分名为Continued fractions
  • @anubhava 抱歉,π 不是 22/7
  • 我当然知道,但即使这个seq 也是近似值,尽管毫无疑问是一个更好的近似值。

标签: bash shell seq bc


【解决方案1】:

这使用 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 执行算术以给出结果。


编辑:如the comment 中所述,此序列收敛非常缓慢。 Machin's formula 的收敛速度明显更高:

对 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

1Pi

【讨论】:

  • 这个序列收敛非常很慢。您需要超过 1500 次迭代才能获得优于 22/7 的近似值。
  • @KeithThompson 你是对的。编辑使用 Machin 公式计算 π,该公式收敛速度快得多
【解决方案2】:

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

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

a 是 arctan,这会将 pi 赋予 1000 位数字。

【讨论】:

  • 您可以在末尾使用管道 sed 's/.$//' 并将其更改为 scale=1001 因为最后一位数字被捏造了,但我仍然喜欢这个答案。
  • 我还要添加BC_LINE_LENGTH=0 bc -l 以避免断线疯狂:unix.stackexchange.com/questions/365510/…
【解决方案3】:
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

这是 pi 的近似值。 'bc' 程序计算并打印该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2016-08-07
    • 2021-04-01
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多