什么命令可以为我打印pi?我想指定它可以打印多少个数字,但我在网上找不到任何东西。我只希望能够打印pi。
什么命令可以为我打印pi?我想指定它可以打印多少个数字,但我在网上找不到任何东西。我只希望能够打印pi。
Answers:
您可以使用以下命令:
echo "scale=5; 4*a(1)" | bc -l
3.14159
其中scale是小数点后的位数。
参考:http : //www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bash
和另一个外壳在这里支持字符串:bc -l <<< "scale=5; 4*a(1)"
。
scale=1000
会很快给出999个正确的数字(最后一位数字减去1,这是合理的,因为我们正在计算pi / 4,然后乘以4)。scale=4000
在几秒钟内给出4000个正确的数字。scale=10000
花费的时间比我的耐心要长,但可能会提供9999或10000个正确的数字。
如果已tex(1)
安装:
tex --version | head -1 | cut -f2 -d' '
cut
。等待很长时间然后再次运行命令,可以打印更多的数字。
对于任意精度的打印,可以使用bc
和公式pi = 4*atan(1)
:
# bc -l
scale=<your precision>
4*a(1)
scale
,pi = 3.141592..
但是echo "scale=5; 4*a(1)" | bc -l => 3.14156
我希望看到3.14159
?
scale
指定用于计算的精度,因此使用时scale=5
,任何原子操作都不会使用超过5个小数位。
如果您想要某种可以计算π值的东西,那么有几种方法。也许最明显的解决方案是使用现成的软件包,例如pi
(Debian软件包链接),如果要信任Debian的软件包描述,可以将该值计算为任意精度,并且仅受内存限制。
pi
实际上是CLN库(数字类库)附带的一个示例。它包括一些示例应用程序,这些应用程序提供了用于生成任意长度的数字(例如Pi,Fibonacci等)的工具。CLN软件包可预先打包在Debian / Ubuntu中(这就是上面的Debian链接所指向的)。
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
注意:这些示例的来源在此处位于CLN代码库的来源中。
在Fedora上,我必须下载源tarball并自行构建,但构建时很少大惊小怪。不论出于何种原因cln
,Fedora上的软件包仅包含库,而忽略了Debian / Ubuntu版本中可用的示例(上述)。
pi
听起来像您想要的东西。例如,您可以执行pi 300
打印前300位数的操作。
对于最多一百万个数字,您可以使用以下内容(此处为3000个数字):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
退出而导致管道中断后停止下载?如果是这样,我同意,它将是O(n)。
其他一些答案在输出的最后位置显示不正确的数字。以下是使用的变体答案,bc
但结果正确舍入。该变量s
包含有效位数(包括3
小数点前)。
$ bc -l <<< "s=5; scale=s+2; pi=4*a(1)+5*10^(-s); scale=s-1; pi/1"
3.1416
$ bc -l <<< "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1"
3.1415
舍入直接在中执行bc
。这不受命令的限制,该命令printf
使用C语言double
类型表示形式表示数字,其精度约为17个有效数字。四舍五入见答案printf
。
scale=s-1
设置要截断的位数。pi/1
将结果除以1以应用截断。简单pi
不会截断数字。
四舍五入需要将要截断的第一个数字加5(5×10 -s),以便在数字高等于5的情况下,将保留的最后一个数字递增。
从霍布斯的测试看来,scale=s+2
即使很长的数字,也将四舍五入/舍去的另外三个数字()就足够了。
上面的例子在这里的字符串,其支持例如bash
,ksh
和zsh
。如果您的外壳不支持此处,请使用字符串echo
和管道代替:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
perl一行(使用bignum):
perl -Mbignum=bpi -wle 'print bpi(NUM)'
例如
perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159
使用python2:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
此功能可在Python 2和3中使用。似乎只有12位数字。
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])"
。提高精度以获取更多数字...例如python -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
只有几秒钟,达到一百万个数字。一点也不差 !!!。
我怎么想念这个问题...
这是我几个星期前在Stack Overflow上发布的Python pi程序。它的速度不是特别快,但是可以做很多数字。:)但是,正如我在该线程中提到的那样,我通常使用Python的mpmath模块进行任意精度算术,而mpmath具有相当快的pi生成器。
例如,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
恕我直言,考虑到它运行在具有单核2GHz处理器,2 GB RAM并写入旧的IDE驱动器的计算机上,在5秒内提供500000位小数的pi并不是太过分。
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
在两秒内(在pip3安装了mpmath之后)输入一百万个数字。一点也不差 !!!。
如果已node.js
安装,这将为您找到pi尽最大努力,尽管它的最佳表现不是很好:
node -e 'for(a=0,b=4E8,m=Math,r=m.random;b--;)a+=(1>m.sqrt((c=r())*c+(d=r())*d));console.log(a/1E8)'
样本输出:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
总比最好的要好。
echo pie
什么?
蒙特卡罗方法
参见,例如,这对于本方法的说明。
注意事项
好处
好玩:-)
perl -Mbignum -E '
for(0 .. 1_000_000){
srand;
$x=rand; # Random x coordinate
$y=rand; # Random Y coordinate
$decision = $x**2 + $y**2 <=1 ? 1:0; # Is this point inside the unit circle?
$circle += $decision;
$not_circle += 1-$decision;
$pi = 4*($circle/($circle+$not_circle));
say $pi
}'
注意:我首先尝试了一下,srand
但没有卡住,3.14
之后的数字一直在振荡,从未收敛。这可能是因为一段时间后PRNG开始重复其自身。使用srand
可以避免或至少延长伪随机序列的周期。这都是推测,所以如果我错了,请随时纠正我。
bignum
Perl的操作,而且我不知道上述程序中需要更新的Perl的任何特定部分。无论如何,有趣的是算法本身。如果该Perl不适合您,请尝试以您选择的语言实现它。
($x,$y,$circle,$not_circle)=(0,0,0);
在循环之前添加,以确保在使用之前定义了所有变量。
(0,0,0,0)
。
($x,$y,$circle,$not_circle)=(0,0,0,0)
。一两分钟后,它徘徊在所需的值附近,然后在我停下之前,它更接近于3.1409。有趣而有趣!谢谢!
您可以对pi使用spigot算法。Dik Winter和Achim Flammenkamp编写的以下C程序将生成pi的前15,000位,一次生成一位。
a[52514],b,c=52514,d,e,f=1e4,g,h;main(){for(;b=c-=14;h=printf("%04d",e+d/f))for(e=d%=f;g=--b*2;d/=g)d=d*b+f*(h?a[b]:f/5),a[b]=d%--g;}
的PHP
几个例子:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
如果要更改精度,请尝试:
php -d precision=100 -r 'echo pi();'
浮点数的大小取决于平台,尽管通常值(64位IEEE格式)的最大值约为1.8e308,精度约为14个十进制数字。[阅读更多]
如果您想要更精确的精度,请查看Rosetta Code或Code Golf SE以获取一些编程解决方案。
相关:可以在SR.SE上计算PI至少为一千位数的软件
这是一个脚本,该脚本以用户指定的位数(包括“。”)打印pi。
sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
输出
$ ./pi.sh 10
3.14159265
并使用默认值:
$ ./pi.sh
3.14159
我见过人们使用它scale
作为bc
选项,但是在我的情况下(bc 1.06.95
),它不会输出正确的值:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
注意最后一位。
./pi.sh 10
印刷品会以九位数显示,并以开头计算3
。另外,您指的是四舍五入误差,但是您的./pi.sh 6
output 3.1415
可能不是最佳的。
scale=X
选项bc
不会舍入数字,而只是截断第X个十进制数字。
我喜欢Abey的回答,但不喜欢BC如何更改最后一位数字。
echo "scale=5; 4*a(1)" | bc -l
3.14156
因此,我删除了使用printf设置的数字位数。
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
与相比,浮点数受到严格限制bc
。它们由C语言double
类型表示 ,精度约为17位数字,因此,即使第 17 位之后的非零数字也是伪造的!------我添加了一个答案,正确舍入了结果,不受限制printf
。------同样,要确保此命令可以在各种语言环境下工作,您必须执行以下操作:LC_ALL=C printf
...
如果您一生都不记得该arctan
怎么办?或者假设您甚至都不知道该函数存在于中bc
,然后尝试记住这个简单的除法:
echo "scale=6; 355 / 113" | bc
3.141592
仅适用于6位数字,但对于非科学计算,则可以正常工作。
如果您认为自己也不记得这两个数字,请先写分母,然后写分子:
113355
还是为什么不
11 33 55
“双1,双3,双5”。所有数字都是奇怪的。要进行计算,请将6位数字再对半分割,并在除以分母和分子之前将其交换。就是这样
4 * arctan(1)
一个更容易记住2三位号码......我会轻松地使用335,而不是355或133,而不是113
可以假定OP对一个简短,易于记忆的shell命令打印π感兴趣-但问题并没有真正说明这一点。这个答案忽略了这个假设,严格按照书面回答了这个问题。
虽然已经有18个答案,但仍然缺少一种方法-答案如此之多,它可能会认为不是唯一一个缺少的方法:
琐碎的方法:如何打印π?只需打印π!
这种方法似乎根本没用,甚至无法考虑,但我将证明它确实有其优点:
通常,我们将计算π的值。我看不出是什么让我们无法通过预先计算值来优化解决方案的,因为它是一个常数,任何编译器都可以做到这一点。
我们需要一定数量的π,但要达到最大精度。因此,我们可以将常量的前缀作为文本:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
带有显式参数精度的变体,例如。为了精度5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
可以通过使用其他答案之一计算出的合适常数来任意选择最大精度。它仅受命令行最大长度的限制。
查找值具有恒定的时间复杂度。
基于实施的低复杂性,它使所有限制和约束显而易见。
它以完全可用的精度返回常量(不带尾部0
),从而优雅地处理大于最大值的精度。
因此,这种解决方案虽然很简单,但确实具有优势。例如,当它在shell函数中使用时,它可能会很有用。
上面的解决方案的功能也可以在不创建过程的情况下进行补充cut
(假设echo
是内置的shell)。它printf
以某种模糊的方式使用命令(通常是内置
函数):常数完全作为字符串处理(格式使用%s
),不涉及浮点运算,因此此处的限制float
或double
不适用。转义
的精度值%s
(5
在下面的示例中)指定要打印的字符串前缀的长度-这是精度。该3.
是部分printf
格式,以保持它的精确计算。
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
精度作为单独参数的替代方案:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
或者稍微更易读(注之间的空间3.
和14159...
,它们是独立的参数):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
printf
可以预料到,使用这种变体的速度非常快:因为printf
是在像shell bash
和shell这样的通用shell中内置的shell zsh
,它不会创建任何进程。
同样,它不涉及任何与浮点相关的代码,而仅涉及字节数组的操作(显式不是多字节字符)。这通常比使用浮点更快,通常更快。
通常情况下,我们有理由取代 printf
的 /usr/bin/printf
,以保证一致性和兼容性。在这种情况下,我认为我们可以使用内建函数-这很重要,因为使用内建函数/usr/bin/printf
会通过分叉进程来降低“快速”优势。兼容性
的常见问题printf
是数字输出格式取决于语言环境。.
可以,
根据区域设置将数字分隔更改为;但是我们不使用数字,而只使用包含文字的字符串常量.
-不受语言环境的影响。
StéphaneChazelas指出printf %.5s
,zsh
,通过计算字符(而不是通常的字节)来计算。幸运的是,我们的常量仅使用较低ASCII范围内的字符,只要我们UTF-8
对Unicode 使用通用编码,而不使用固定宽度编码,则在任何相关编码中每个字符每个字节用一个字节编码。
printf %.5s
是基于zsh的char(不是字节)(明智地,但针对POSIX)。ksh93
的%.5Ls
是基于字素的。