如何打印 pi (3.14159)?

Dis*_*ame 38 command math

什么命令可以为我打印 pi?我想指定它打印了多少位数字,我在网上找不到任何东西。我只想能够打印 pi。

Ste*_*n D 62

如果您已tex(1)安装:

tex --version | head -1 | cut -f2 -d' '
Run Code Online (Sandbox Code Playgroud)

  • @DavidRicherby 可以通过额外调用“cut”来打印更少的数字。通过等待很长时间并再次运行命令可以打印更多数字。 (30认同)
  • 仅仅因为聪明,这几乎值得点赞。尽管升级包时此输出会发生变化。我们应该认为这是一个功能还是一个错误? (13认同)
  • @MichaelKjörling 实际上,它变成了更精确的 pi 近似值。 (8认同)

小智 54

你可以使用这个命令:

echo "scale=5; 4*a(1)" | bc -l
3.14159
Run Code Online (Sandbox Code Playgroud)

其中 scale 是小数点后的位数。

参考:http : //www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/

  • `bash` 和其他支持此处字符串的 shell 中的较短版本:`bc -l <​​<< "scale=5; 4*a(1)"`。 (12认同)
  • @DisplayName 不少。`scale=1000` 很快就给出了 999 个正确的数字(最后一个数字减去 1,这是合理的,因为我们正在计算 pi/4 然后乘以 4)。`scale=4000` 在几秒钟内给出 4000 个正确的数字。`scale=10000` 花费的时间比我有耐心,但可能会给出 9999 或 10000 个正确的数字。 (4认同)
  • 这在我的机器上给出了不正确的结果,键入 'echo "scale=5; 4*a(1)" | bc -l' 返回 3.14156,此时最后一位数字应为 9 (4认同)
  • 我想知道这可以是多少位数? (2认同)

Abr*_*as2 23

对于任意精度的打印,您可以使用bc和公式pi = 4*atan(1)

# bc -l
scale=<your precision>
4*a(1)
Run Code Online (Sandbox Code Playgroud)

  • `scale` 指定用于计算的精度,因此在 `scale=5` 的情况下,任何原子操作都不会使用超过五个小数位。 (7认同)
  • `scale` 选项有一些_funny_,`pi = 3.141592..` 但带有`echo "scale=5; 4*a(1)" | bc -l =&gt; 3.14156` 然后我希望看到 `3.14159` 吗? (2认同)

use*_*ser 20

如果你想要一些可以计算 ? 值的东西那么有几种方法。也许最明显的解决方案是使用现成的软件包,如pi(Debian package link),如果要信任 Debian 的软件包描述,它可以计算任意精度的值,仅受内存限制。

pi实际上是包含在CLN 库(数字类库)中的一个示例。它包括提供用于生成任意长度数字的工具的示例应用程序,例如 Pi、Fibonacci 等。 CLN 包可在 Debian/Ubuntu 中预先打包(这就是上面的 Debian 链接所指向的内容)。

例子
$ ./pi 10
3.141592653

$ ./pi 20
3.1415926535897932384
Run Code Online (Sandbox Code Playgroud)

注意:这些示例的源代码位于 CLN 代码库的源代码中

其他发行版

软呢帽

在 Fedora 上,我必须下载源 tarball 并自己构建它,但它构建起来并不大惊小怪。无论出于何种原因cln,Fedora 上的软件包仅包含库,但忽略了 Debian/Ubuntu 版本(以上)中可用的示例。

拱提供在同一个程序cln(感谢Amphiteót)。

  • @KyleStrand 我发现了一个真正了不起的答案,这个评论太狭隘了。嘿,[它适用于费马](https://en.wikipedia.org/wiki/Fermat%27s_Last_Theorem#Fermat.27s_conjecture)! (3认同)
  • “总价值”??那是什么意思...? (2认同)
  • @DisplayName 阅读答案的其余部分。像“pi”这样的专用程序听起来正是您正在寻找的。例如,您可以执行诸如“pi 300”之类的操作来打印前 300 位数字。 (2认同)

Ant*_*hon 18

对于最多一百万位数字,您可以使用以下内容(此处为 3000 位数字):

curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
Run Code Online (Sandbox Code Playgroud)

  • 此外,在实际世界中,很难说任何网络交互都是 O(1) 时间复杂度。:P (7认同)
  • @MichaelKjörling 当您说 O(1) 时,您实际上不是说 O(n) 吗?下载时间与您需要的位数成线性关系,因此为 O(n)。 (4认同)
  • 这有一个额外的好处,它应该合理地接近 O(1) 复杂度。或者也许这毕竟不是一个好处...... (2认同)
  • @HalosGhost 对于我们的目的(与每次计算 pi 的 *n* 位数相比),通过网络从特定服务器下载固定数量的数据可能是 *有效的 * O(1),而计算 *n* 位数pi 可能是 * 至少 * 之类的 O(log n) 并且很可能更高(我不熟悉这些算法)。数据的实际下载可能比开始下载的开销花费更多的时间,因此下载时间占主导地位,并且在给定合理固定的数据传输速率的情况下,您会得到 O(1) 附近的某个地方。因此 O(1)。 (2认同)

pab*_*ouk 15

其他一些答案在输出的最后位置显示不正确的数字。以下是使用bc但具有正确舍入结果的答案的变体。该变量s包含有效数字的位数(包括3小数点前面)。

四舍五入

$ bc -l <<< "s=5; scale=s+2; pi=4*a(1)+5*10^(-s); scale=s-1; pi/1"
3.1416
Run Code Online (Sandbox Code Playgroud)

向下舍入(截断)

$ bc -l <<< "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1"
3.1415
Run Code Online (Sandbox Code Playgroud)

四舍五入的解释

舍入直接在 中执行bc。这没有命令的限制,该命令printf使用 C 语言double类型表示的数字具有大约 17 位有效数字的精度。请参阅四舍五入答案printf

scale=s-1设置要截断的位数。pi/1将结果除以 1 以应用截断。Simplepi不会截断数字。

四舍五入需要将 5 添加到第一个将被截断的数字 (5×10 -s ),以便在数字大于等于 5 的情况下,将保留的最后一位数字将增加。

hobbs测试看来,scale=s+2即使对于很长的数字,四舍五入/截断 ( ) 的三个额外数字也足够了。

这里的字符串

上面的示例在此处使用支持的字符串,例如 in bash,kshzsh。如果您的 shell 不支持此处使用字符串echo和管道:

$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" |  bc -l
3.1415
Run Code Online (Sandbox Code Playgroud)

  • 正如您在评论中声称的那样,为了四舍五入而计算额外的三个数字并不是“正确的四舍五入”。首先,您对计算误差没有限制。如果fduff声称的最后一位可以错3个单位,那为什么最后一位不会错1000个单位呢?其次,参见“制表者的困境”。 (2认同)

don*_*sti 12

perl 一行(使用bignum):

perl -Mbignum=bpi -wle 'print bpi(NUM)'
Run Code Online (Sandbox Code Playgroud)

例如

perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159
Run Code Online (Sandbox Code Playgroud)


mkc*_*mkc 9

使用 python2:

$ python -c "import math; print(str(math.pi)[:7])"
3.14159
Run Code Online (Sandbox Code Playgroud)

  • 为完整起见,此解决方案是特定于 python2 的。 (4认同)

Ste*_*teM 7

使用红宝石:

require "bigdecimal"
require "bigdecimal/math"
include BigMath

BigDecimal(PI(100)).round(9).to_s("F")

3.141592654
Run Code Online (Sandbox Code Playgroud)