Pi benim için hangi komutu basar? Kaç basamak basılacağını belirtmek istiyorum, çevrimiçi bir şey bulamadım. Sadece pi yazdırabilmek istiyorum.
Pi benim için hangi komutu basar? Kaç basamak basılacağını belirtmek istiyorum, çevrimiçi bir şey bulamadım. Sadece pi yazdırabilmek istiyorum.
Yanıtlar:
Bu komutu kullanabilirsiniz:
echo "scale=5; 4*a(1)" | bc -l
3.14159
Ölçek, ondalık noktadan sonraki hane sayısıdır.
Kaynak: http://www.tux-planet.fr/calculer-le-chiffre-pi-en-ligne-de-commande-sous-linux/
bash
ve burada dizeleri destekleyen diğer kabuklar: bc -l <<< "scale=5; 4*a(1)"
.
scale=1000
oldukça hızlı bir şekilde 999 rakamı verir (son rakam 1 ile kapalı, makul bir değer pi / 4'ü hesapladığımızdan ve 4 ile çarptığımız için). scale=4000
birkaç saniye içinde 4000 doğru rakam verir. scale=10000
sabrımdan daha uzun sürüyor, ancak muhtemelen 9999 veya 10000 doğru rakam veriyor.
Eğer tex(1)
yüklediyseniz:
tex --version | head -1 | cut -f2 -d' '
cut
. Uzun süre bekleyip komutu tekrar çalıştırarak daha fazla rakam basılabilir.
Keyfi hassasiyetle yazdırmak bc
için aşağıdakileri kullanabilirsiniz pi = 4*atan(1)
:
# bc -l
scale=<your precision>
4*a(1)
scale
, pi = 3.141592..
ama echo "scale=5; 4*a(1)" | bc -l => 3.14156
sonra görmeyi beklerdim 3.14159
?
scale
hesaplama için kullanılacak hassasiyeti belirtir, böylece scale=5
hiçbir işlem, herhangi bir atomik işlem için beşten fazla kesirli basamak kullanmaz.
Eğer π değerini hesaplayabilecek bir şey istiyorsanız , o zaman birkaç yaklaşım var. Belki de en bariz çözüm , Debian'ın paket açıklamasına güvenilmesi gerekiyorsa, değeri yalnızca hafıza ile sınırlı bir keyfi hassasiyetle hesaplayabilen pi
(Debian paket bağlantısı) gibi hazır bir paket kullanmak olacaktır .
pi
aslında CLN kütüphanesinde (Sayılar İçin Sınıf Kütüphanesi) bulunan bir örnektir . Pi, Fibonacci, vb. Gibi sayıların isteğe bağlı uzunluklarını üretmek için araçlar sağlayan örnek uygulamaları içerir. CLN paketleri Debian / Ubuntu'da önceden paketlenmiştir (yukarıdaki Debian bağlantısının gösterdiği şey).
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
NOT: Bu örneklerin kaynağı, CLN kod tabanı için kaynaktır .
Fedora'da, kaynak tarball'ı indirmem ve kendim oluşturmam gerekti, ancak küçük bir karışıklık yarattı. Her ne nedenle olursa olsun cln
, Fedora'daki paket sadece kütüphaneyi içerir ancak Debian / Ubuntu versiyonunda mevcut olan örnekleri ihmal eder (yukarıdaki).
Arch , cln
paketteki aynı programı sunar (teşekkürler Amphiteót ).
pi
Tam olarak aradığınızı gibi sesler gibi özel bir program . pi 300
Örneğin ilk 300 basamağı yazdırmak gibi şeyler yapabilirsiniz .
Bir milyon haneye kadar aşağıdakileri kullanabilirsiniz (burada 3000 rakam için):
curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000
cut
mı? Bu durumda, katılıyorum, O (n) olurdu.
Diğer cevapların bazıları çıktının son yerlerinde yanlış rakamları gösteriyor. Aşağıda, ancak doğru yuvarlanmış bir sonuç kullanan yanıtınbc
bir varyasyonu verilmiştir . Değişken s
, önemli basamakların sayısını ( 3
ondalık basamağın önünde dahil ) içerir.
$ 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
Yuvarlama doğrudan içinde gerçekleştirilir bc
. Bu, yaklaşık 17 anlamlı hane hassasiyetinde olan sayılar için printf
C dili double
tipi gösterimini kullanan komutun sınırlandırılmasına sahip değildir . Yuvarlama ile cevabaprintf
bakınız .
scale=s-1
kesilecek basamak sayısını ayarlar. pi/1
kesmeyi uygulamak için sonucu 1'e böler. Basit pi
sayıyı kesmiyor.
Yuvarlama yarısı, kesilecek (5 × 10 -s ) birinci haneye 5 eklemeyi gerektirir, böylece 5 basamağın daha yüksek olması durumunda, kalan son rakam artırılır.
Hobilerin yaptığı testlerden, yuvarlanacak / kesilecek ( scale=s+2
) üç ek rakam çok uzun sayılar için bile yeterli olacaktır.
Kullanım Yukarıdaki örnekler burada dizeleri örneğin desteklenir bash
, ksh
ve zsh
. Eğer kabuğunuz burada desteklemiyorsa, string kullanın echo
ve bunun yerine pipo:
$ echo "s=5; scale=s+2; pi=4*a(1); scale=s-1; pi/1" | bc -l
3.1415
Python2 ile:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
bu Python 2 ve 3 ile çalışır. Sadece 12 haneye sahip görünüyor.
python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])"
. Daha fazla basamak için hassasiyeti artırın ... örneğinpython -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
rakam bir milyon rakam için sadece bir kaç saniyeydi. Hiç de fena değil !!!.
Bash:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
gerektirir groff
yüklü olması gerekmektedir. İşte Ubuntu'da (ve lezzetlerde), standart değildir . JFYI.
PHP'de yerleşik pi () işlevini kullanarak çok basit:
<?php
echo round(pi(), 2);
?>
Bu soruyu nasıl özledim ...
İşte 'Ben Yığın taşması önce birkaç hafta yayınlanan o benim biraz Python pi programı bu. Özellikle hızlı değil, ancak çok sayıda basamak yapabilir. :) Ancak, bu başlıkta bahsettiğim gibi, genellikle Python'un mpmath modülünü rastgele hassas aritmetik için kullanıyorum ve mpmath oldukça hızlı bir pi yapımcısına sahip.
Örneğin,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
5 saniyenin altındaki 500000'lik pi onayı çok perişan değil, IMHO, tek çekirdekli bir 2GHz işlemciye, 2 gig RAM'e ve eski bir IDE sürücüsüne yazmaya çalıştığını düşünüyor.
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
(Bir pip3 mpmath'ı yükledikten sonra) bir milyon hane için iki saniyenin altında deneyin . Hiç de fena değil !!!.
Eğer node.js
yüklediyseniz, bu sizin için pi bulmakta elinden gelenin en iyisini yapsa da, en iyisi çok iyi olmasa da:
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)'
Örnek çıktılar:
3.14157749
3.1416426
3.14159055
3.14171554
3.14176165
3.14157587
3.14161137
3.14167685
3.14172371
node -e 'console.log(Math.PI)'
, en iyisinden biraz daha iyidir.
echo pie
?
Monte Carlo Yöntemi
Örneğin, bakınız , bu , bu yöntemin bir açıklama için.
Uyarılar
Avantajları
Eğlence :-)
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
}'
Not: İlk önce onsuz denedim srand
ama takıldı 3.14
ve bundan sonra rakamlar salınmaya devam etti, asla yakınlaşamadı. Bunun nedeni muhtemelen bir süre sonra PRNG'nin kendisini tekrarlamaya başlamasıdır. Kullanımı, srand
bundan kaçınacak veya en azından sözde rastgele dizinin süresini uzatacaktır. Bunların hepsi bir varsayım, bu yüzden hatalıysam beni düzeltmekten çekinmeyin.
bignum
Perl'deki operasyonlardan pek memnun değilim, korkarım ve yukarıdaki programın daha yeni bir Perl gerektiren herhangi bir bölümünü bilmiyorum. Her neyse, bununla ilgili ilginç olan şey algoritmanın kendisi. Bu Perl sizin için çalışmıyorsa, tercih ettiğiniz dilde uygulamayı deneyin.
($x,$y,$circle,$not_circle)=(0,0,0);
Tüm değişkenlerin kullanılmadan önce tanımlandığından emin olmak için döngüden önce eklemeyi deneyebilirsiniz .
(0,0,0,0)
.
($x,$y,$circle,$not_circle)=(0,0,0,0)
. Bir ya da iki dakika sonra, istenen değer etrafında asılıydı, sonra durmadan 3.1409'a çok yaklaştı. İlginç ve eğlenceli! Teşekkür ederim!
Pi için bir tıkaç algoritması kullanabilirsiniz. Dik Winter ve Achim Flammenkamp'ın izleyen C programı, her seferinde bir rakam olan ilk 15.000 pi sayısını üretecek.
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
Birkaç örnek:
php -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
Hassasiyeti değiştirmek istiyorsanız deneyin:
php -d precision=100 -r 'echo pi();'
Şamandıranın boyutu platforma bağlıdır, ancak kabaca 14 ondalık basamağa sahip bir azami ~ 1.8e308 ortak bir değerdir (64 bit IEEE formatı). [daha fazla oku]
Daha doğru bir hassasiyet arıyorsanız, bazı programlama çözümleri için Rosetta Code veya Code Golf SE'yi kontrol edin .
İlgili: SR.SE'de PI'yi en az bin haneye kadar hesaplayabilen yazılım
İşte pi tarafından kullanıcı tarafından belirtilen ('.' Dahil) rakamların sayısıyla basılan bir betik.
pi.sh
#!/bin/bash
len=${1:-7}
echo "4*a(1)" | bc -l | cut -c 1-"$len"
çıktı
$ ./pi.sh 10
3.14159265
ve varsayılan değere sahip:
$ ./pi.sh
3.14159
scale
Bir bc
seçenek olarak kullanan insanları gördüm , ancak benim durumumda ( bc 1.06.95
) bu doğru değeri vermiyor:
$ echo "scale=5;4*a(1)" | bc -l
3.14156
Son haneye dikkat edin.
./pi.sh 10
ilk sayım baskılar dokuz basamak, 3
. Ayrıca, yuvarlama hatasının parmağını işaret ediyorsunuz, ancak ./pi.sh 6
çıktılarınız 3.1415
en uygun olmayabilir.
scale=X
seçeneği bc
sayı DEĞİLDİR, ancak X'inci ondalık basamağındaki sayıyı kesin.
Abey'in cevabını seviyorum ama bc'nin son rakamı nasıl değiştirdiğini beğenmedim.
echo "scale=5; 4*a(1)" | bc -l
3.14156
Bu yüzden hane sayısını ayarlamak için kullanılan printf skalasını kaldırdım.
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
kayan nokta sayıları ile karşılaştırıldığında ciddi bir sınırlama vardır bc
. Bunlar C dili ile temsil edilmektedir double
tip yüzden bile 17 hakkında basamak hassasiyetle 17. yaklaşık bir düzmece sonra sıfır olmayan rakamları! ------ Sonuç ile sınırlandırılmayan sonucun doğru yuvarlanması ileprintf
bir cevap ekledim . ------ Ayrıca bu komutun çeşitli yerel LC_ALL=C printf
Ya hayatı boyunca bu arctan
şeyi hatırlayamıyorsan ? Veya varsayalım ki bu fonksiyonun var olduğunu bile bilmiyorsunuz bc
, daha sonra bu basit bölümü ezberlemeye çalışın:
echo "scale=6; 355 / 113" | bc
3.141592
Yalnızca 6 basamak için çalışacak, ancak bilimsel olmayan hesaplamalar için bu iyi olacaktır.
Bu iki sayıyı da hatırlayamayacağınızı düşünüyorsanız, önce paydayı, sonra payını yazın:
113 355
Ya da neden olmasın
11 33 55
"çift 1, çift 3, çift 5". Tüm rakamlar tuhaf. Hesaplamak için, 6 basamaklı sayıyı tekrar ikiye bölün ve ayırmadan önce payda ile pay değiştiriciyi değiştirin. Bu konuda.
4 * arctan(1)
üç üç hanenin 2 rakamını hatırlamak daha kolay buluyorum ... 355 yerine 335, 113 yerine 133 kullanıyorum.
OP'nin yazdırılması için kabuk komutunu ezberlemesi kolay, kısa, kısa bir ilgi ile ilgilendiği varsayılabilir the - ama soru gerçekten öyle değil. Bu cevap, bu varsayımı görmezden geliyor ve soruyu kesinlikle yazıldığı gibi yanıtlıyor;
Halen 18 cevap varken, bir yaklaşım hala eksik - ve çok fazla cevapla, eksik olan tek şey olmadığını düşünebilir:
önemsiz olan: Nasıl yazdırılır? Sadece yazdırın π!
Bu yaklaşım, düşünmek için bile çok işe yaramaz gibi görünüyor, ancak bunun yararlarının olduğunu göstereceğim:
Normalde π değerini hesaplardık. Bizi, çözümü optimize etmekten alıkoyan ne göremiyorum, değeri önceden hesaplayarak - bu bir sabittir, herhangi bir derleyici bunu yapar.
Maksimum hassasiyete kadar bazı rakamları of istiyoruz. Böylece sadece sabitin önekini metin olarak alabiliriz:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
Kesinlik için açık bir argüman olan bir değişken, örn. hassasiyet için 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
Maksimum hassasiyet, diğer cevaplardan biri kullanılarak hesaplanan uygun bir sabit kullanılarak keyfi bir şekilde seçilebilir. Sadece bir komut satırının azami uzunluğu ile sınırlıdır.
Değeri bulmak için sürekli zaman karmaşıklığına sahiptir.
Uygulamanın düşük karmaşıklığına bağlı olarak tüm sınırlamaları ve kısıtlamaları açıkça ortaya koyar.
Sabitliği tam kullanılabilir hassasiyette (iz bırakmadan 0
) geri döndürerek hassasiyeti maksimumdan daha büyük olarak işler .
Yani bu çözüm, önemsiz olsa da, avantajları var. Örneğin bir kabuk fonksiyonunda kullanıldığında yararlı olabilir.
Yukarıdaki çözümün işlevselliği ayrıca cut
( echo
bir kabuk yerleşik olduğu varsayılarak) için bir işlem oluşturmadan da uygulanabilir . Komutu printf
(normalde bir yerleşik) biraz belirsiz bir şekilde kullanır:
Sabit, tamamen bir dize olarak kullanılır (format kullanılır %s
), burada kayan nokta aritmetiği yoktur, bu nedenle sınırlamaları yoktur float
veya double
burada geçerli değildir.
Hassas değeri %s
(kaçış 5
hassas olan - Aşağıdaki örnekte) yazdırmak için dize önek uzunluğunu belirtir. 3.
Bir parçası olan printf
hassas hesaplama dışarı tutmak için formatta.
$ printf "3.%.5s\n" 1415926535897932384626433832795
3.14159
Ayrı bir argüman olarak hassasiyetle alternatif:
$ printf "3.%.*s\n" 5 1415926535897932384626433832795
3.14159
Ya da biraz daha okunabilir ( 3.
ve arasındaki boşluğa dikkat edin 14159...
, bunlar ayrı argümanlardır):
$ printf "%s%.5s\n" 3. 1415926535897932384626433832795
3.14159
Kullanılan varyantın printf
çok hızlı olması beklenebilir: Çünkü printf
gibi genel kabuklarda yerleşik bir kabuktur bash
ve zsh
herhangi bir işlem yaratmaz.
Ayrıca, herhangi bir kayan noktayla ilgili koda da dokunmaz, ancak yalnızca bayt dizilerini değiştirir (açıkça çok baytlı karakterler değil). Bu genellikle daha hızlıdır, genellikle kayan nokta kullanımından çok daha hızlıdır.
Çoğu zaman, yerine nedenler vardır printf
tarafından /usr/bin/printf
garanti tutarlılık ve uyumluluğuna. Bu durumda, yapıyı kullanabileceğimizi düşünüyorum - ki bu önemli, /usr/bin/printf
bir sürecin önüne geçerek "hızlı" avantajı azaltır. Uyumluluk
ile ilgili yaygın bir sorun printf
, yerel ayarlara bağlı olarak sayı çıkış biçimidir. .
Sayıların ayrılması ,
yerel ayarlara göre değiştirilebilir ; Fakat rakamları kullanmıyoruz, sadece değişmez içeren bir dize sabiti .
- yerel ayarlardan etkilenmez.
StéphaneChazelas, printf %.5s
farklı çalıştığını belirttizsh
, her zamanki gibi bayt değil, karakter sayılarak Neyse ki sabitlerimiz, UTF-8
Unicode için ortak kodlamayı kullandığımız ve sabit genişlik kodlaması kullandığımız sürece, ilgili kodlamalarda yalnızca karakter başına bir bayt tarafından kodlanan ASCII aralığındaki karakterleri kullanır .
printf %.5s
Zsh (duyarlı, ancak POSIX'e karşı) tabanlı char (bayt değil) olduğuna dikkat edin . ksh93
's %.5Ls
grafik tabanlı.