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/
bashve burada dizeleri destekleyen diğer kabuklar: bc -l <<< "scale=5; 4*a(1)".
scale=1000oldukç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=4000birkaç saniye içinde 4000 doğru rakam verir. scale=10000sabrı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 bciç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.14156sonra görmeyi beklerdim 3.14159?
scalehesaplama için kullanılacak hassasiyeti belirtir, böylece scale=5hiç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 .
piaslı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 , clnpaketteki aynı programı sunar (teşekkürler Amphiteót ).
piTam 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
cutmı? 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ı ( 3ondalı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 printfC dili doubletipi gösterimini kullanan komutun sınırlandırılmasına sahip değildir . Yuvarlama ile cevabaprintf bakınız .
scale=s-1kesilecek basamak sayısını ayarlar. pi/1kesmeyi uygulamak için sonucu 1'e böler. Basit pisayı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, kshve zsh. Eğer kabuğunuz burada desteklemiyorsa, string kullanın echove 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
afmtoditgerektirir groffyü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.jsyü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 srandama takıldı 3.14ve 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ı, srandbundan 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.
bignumPerl'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
scaleBir bcseç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 10ilk 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.1415en uygun olmayabilir.
scale=Xseçeneği bcsayı 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
printfkayan nokta sayıları ile karşılaştırıldığında ciddi bir sınırlama vardır bc. Bunlar C dili ile temsil edilmektedir doubletip 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( echobir 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 floatveya doubleburada geçerli değildir.
Hassas değeri %s(kaçış 5hassas olan - Aşağıdaki örnekte) yazdırmak için dize önek uzunluğunu belirtir. 3.Bir parçası olan printfhassas 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ü printfgibi genel kabuklarda yerleşik bir kabuktur bashve zshherhangi 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 printftarafından /usr/bin/printfgaranti tutarlılık ve uyumluluğuna. Bu durumda, yapıyı kullanabileceğimizi düşünüyorum - ki bu önemli, /usr/bin/printfbir 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 %.5sfarklı çalıştığını belirttizsh, her zamanki gibi bayt değil, karakter sayılarak Neyse ki sabitlerimiz, UTF-8Unicode 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 %.5sZsh (duyarlı, ancak POSIX'e karşı) tabanlı char (bayt değil) olduğuna dikkat edin . ksh93's %.5Lsgrafik tabanlı.