Pi'yi (3.14159) nasıl yazdırırım? [kapalı]


35

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.


28
Dil seçiminizi yapın: rosettacode.org/wiki/Pi
Mark Plotnick 20

4
15'ten daha fazla rakam istiyorsanız daha eğlenceli olacağını unutmayın.
Thorbjørn Ravn Andersen

2
@DisplayName: Çift hassasiyetli kayan nokta değerleri kullanarak PI'yi dahili olarak depolayan / hesaplayan hiçbir programı kullanamayacağınız anlamına gelir (genellikle çoğu dilde bulunan en yüksek hassasiyetli "yerleşik" FP veri tipidir).
Matteo Italia

5
Bundan on yıl önce, genel olarak dil kütüphaneleri tarafından sağlanmadan önceki çözümüm, kullandığım kayan noktaların ihtiyaç duyduğundan çok daha fazla yeri ezberlemekti: 3.1415926535897932384626 genellikle pratik amaçlar için, hatta en pratik olanlar için bile yeterince yakın. -dünya dünyası diğer sayılardakinden daha fazla hata yapacak ve teorikler için sayısal değerden ziyade sembolik yapıya sadık kalacağım.
keshlam

3
@syntaxerror'ın ilgisi alakasız. Çıplak ünlülerin resimlerini isteyen bir soru yayınlayacak olsaydınız, binlerce bakış açısı kazanacak ve büyük olasılıkla artıracaktı. Bu konuda yapmaz. Bu soru çok geniş bir klasik örnek. Sadece cevap sayısına bak. Ayrıca OP'nin olası cevapları esasen sonsuz yapan herhangi bir sınırlama belirtmediğine dikkat edin . Her durumda, kapatma silinmiyor. Soru ve 23 cevabının tamamı hala burada olacak. Kapanış sadece cevapların kabul edilmeyeceği anlamına gelir. Print Basmak için daha da fazla yola ihtiyacımız var mı?
terdon

Yanıtlar:


52

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/


12
Shorter sürümü bashve burada dizeleri destekleyen diğer kabuklar: bc -l <<< "scale=5; 4*a(1)".
pabouk

2
Acaba bu kaç basamak olabilir?
DisplayName

4
@DisplayName epeyce. 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.
Ocaklar

4
Bu, makinemde yanlış bir sonuç veriyor, 'echo "scale = 5; 4 * a (1)" | bc -l ', 3.14156 değerini döndürür, son basamak 9'a geldiğinde
Jordan Bentley,

1
@JordanBentley, sonucun doğru yuvarlanması ile bir cevap ekledim .
pabouk

61

Eğer tex(1)yüklediyseniz:

tex --version | head -1 | cut -f2 -d' '

13
Bu, sadece akıllı olduğu için neredeyse bir avantaj. Paketi yükseltirken bunun çıktısı değişse de. Bunun bir özellik mi, böcek mi olduğunu düşünelim mi?
Bir CVn

8
@ MichaelKjörling Aslında, pi'nin daha kesin bir yaklaşımı olarak değişiyor.
Abrixas2

@ Abrixas2 Evet, biliyorum. TeX'in son versiyonu π.
Bir CVn

30
@DavidRicherby Daha az sayı basılması ek bir çağrı yoluyla basılabilir cut. Uzun süre bekleyip komutu tekrar çalıştırarak daha fazla rakam basılabilir.
Steven D

1
@Ruslan uygulamaya bağlıdır. Bu özel durumda "doğru" yapılmasını beklerdim.
Thorbjørn Ravn Andersen

23

Keyfi hassasiyetle yazdırmak bciçin aşağıdakileri kullanabilirsiniz pi = 4*atan(1):

# bc -l
scale=<your precision>
4*a(1)

2
Seçenekle ilgili komik bir şey var scale, pi = 3.141592..ama echo "scale=5; 4*a(1)" | bc -l => 3.14156sonra görmeyi beklerdim 3.14159?
fduff

7
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.
Abrixas2


20

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).

Örnekler
$ ./pi 10
3.141592653

$ ./pi 20
3.1415926535897932384

NOT: Bu örneklerin kaynağı, CLN kod tabanı için kaynaktır .

Diğer dağıtımlar

fötr şapka

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).

kemer

Arch , clnpaketteki aynı programı sunar (teşekkürler Amphiteót ).


Evet, kafamda olanları yazdığım toplam değeri kastediyordum.
DisplayName

2
"Toplam değer" ?? Anlamı ne...?
Kyle Strand

2
@DisplayName cevabın kalanını okudu. piTam olarak aradığınızı gibi sesler gibi özel bir program . pi 300Örneğin ilk 300 basamağı yazdırmak gibi şeyler yapabilirsiniz .
terdon

3
@KyleStrand Bu yorumun içeremeyeceği kadar dar olduğu için gerçekten müthiş bir cevap buldum. Hey, Fermat için işe yaradı !
terdon

Bunun neden iki aşağı oy aldığını bilmek isterim. Oy kullanmayanlar, yararlı olmadığına karar vermeden önce cevabı okumadılar mı?
Bir CVn

17

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

2
Bunun, O (1) karmaşıklığına makul derecede yakın olması gerektiği ek yararı vardır. Veya belki de bu her şeyden önce bir fayda değil ...
CVn

7
Ayrıca, herhangi bir ağ etkileşiminin pratik bir dünyada O (1) zaman karmaşıklığı olduğunu söylemek zordur. : P
HalosGhost,

2
@HalosGhost Amaçlarımız ( her seferinde pi'nin n rakamını hesaplamakla kıyaslandığında ), bir ağ üzerinden belirli bir sunucudan sabit miktarda veri indirmenin etkin bir şekilde O (1) olması, pi'nin n rakamlarının hesaplanması muhtemel en azından O (log n) gibi bir şey ve oldukça yüksek (bu algoritmalara aşina değilim). Verilerin gerçek indirilmesi, indirmeye başlamak için ek yüke göre önemli ölçüde daha fazla zaman alacaktır, bu nedenle indirme süresi baskın olur ve makul ölçüde sabit bir veri aktarım hızı verildiğinde O (1) civarında bir yere ulaşırsınız. Dolayısıyla, O (1).
Bir CVn

4
@ MichaelKjörling O (1) derken aslında O (n) demek istemiyor musunuz? Gereksinim duyduğunuz basamak sayısındaki lineer yükleme süresi, bu nedenle O (n).
KodlarInChaos

1
@CodesInChaos Hayır, sabit bir basamak sayısı indirdiğiniz için indirme süresi sabittir (sabit iletim hızı verilir). (Bu özel durumda) kıvrılma, indirme işlemi sırasında basmak ve boru kesildikten sonra boru kesildikten sonra indirmeyi durdurmak için yeterince akıllıca olmaz cutmı? Bu durumda, katılıyorum, O (n) olurdu.
CVn

15

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.

Yuvarlak yarım yukarı

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

Yuvarlama (kes)

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

Yuvarlama açıklaması

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.

İşte dizeler

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

2
Yuvarlama amacıyla üç ek basamak hesaplamak bir yorumda iddia ettiğiniz gibi "doğru yuvarlama" değildir. İlk olarak, hesaplama hatasıyla ilgili bir bağınız yok. Fduff tarafından iddia edilen son yerde 3 birim yanlış geldiyse, neden son yerde 1000 birim yanlış gelmiyor? İkinci olarak, “masa üreticisinin ikilemi” konusuna bakın.
Karmaşık biyograf

12

perl bir satır ( bignum kullanarak ):

perl -Mbignum=bpi -wle 'print bpi(NUM)'

Örneğin

perl -Mbignum=bpi -wle 'print bpi(6)'
3.14159

10.000 basamak için: Perl'de 8 dakikaya yakın, bc'de 4'ten az. En hızlı değil.
Isaac

9

Python2 ile:

$ python -c "import math; print(str(math.pi)[:7])"
3.14159

4
Bütünlüğü uğruna, bu çözüm python2 özgüdür.
HalosGhost,

Düzenlemeden sonra, (..)bu Python 2 ve 3 ile çalışır. Sadece 12 haneye sahip görünüyor.
Anthon

-C $ python "ithal matematik; baskı (biçimi (Math.PI, '.400f'))" 3,1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Artem Shitov

1
@ArtemShitov - benim kötü, aktarmayı deneyin gmpy2 (eğer yüklü ise): 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])"
don_crissti

1
Bulduğum en hızlı 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 !!!.
Isaac

7

Ruby kullanarak:

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

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

3.141592654

1
Bir liner:ruby -e 'require "bigdecimal"; require "bigdecimal/math"; include BigMath; puts BigDecimal(PI(100)).round(9).to_s("F")'

4

Bash:

$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884

Amphiteóth @ afmtoditgerektirir groffyüklü olması gerekmektedir. İşte Ubuntu'da (ve lezzetlerde), standart değildir . JFYI.
sözdizimi

@syntaxerror Teşekkürler, iyi nokta! Örneğimi kaldırdım. Demek istediğim grep, bu AI'yı okuduğumda , sabiti aramak için sistemimde çalıştı ve birden fazla yerde buldu. Bu yüzden bu benim için +1'di!


3

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 !!!.
Isaac,

2

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

4
Daha kısa node -e 'console.log(Math.PI)', en iyisinden biraz daha iyidir.
chbrown

1
@chbrown OP'leri "ciddi değil" şartını yerine getirmiyor.
Paul

1
Hangi "ciddi değil" şartı? OP, sadece bir şekilde "ciddi olmayan" cevaplar istediklerini değil, eğlence istediklerini belirtti. yine de ne anlama geliyor? Gibi bir şey echo pie?
terdon

Bunu yazdım çünkü bazen sorular soruyorsanız insanlar "bu bir fabrika yazma senaryosu değildir" diyorlar, bu yüzden bunun gerçek bir nedeni olmadığı için sadece pi'nin nasıl basılacağını bilmek istediğimi söyledim.
DisplayName

@ Amphiteóth Bilgisayarımda çalıştırmak yaklaşık 20 saniye sürer. Sadece biraz zaman vermen gerekebilir.
Paul

2

Monte Carlo Yöntemi

Örneğin, bakınız , bu , bu yöntemin bir açıklama için.

Uyarılar

  • Keyfi olarak doğru değil
  • Yararlı bir şeye yaklaşmak uzun zaman alıyor

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.


@ Amphiteót Orada neler olduğundan emin değilim. Bu yardımcı olursa Perl v5.14.2. 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.
Joseph R.

1
@ Amphiteót Anladım. Düzenleme probleminizi çözdü mü?
Joseph R.

@ Amphiteót ($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 .
Joseph R.

@ Amphiteót Benim hatam. Yukarıdaki parens olmalıydı (0,0,0,0).
Joseph R.

Bunu yeniden /5.20.1: Mantıklı ama görmedim! Gerçekten de ($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!

2

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;}

Bağlam: wiki , burada ve burada .

1
Borwein, Bailey ve Plouffe'ın logaritmik sabitleri için tıkanma algoritmasını seviyorum, ancak bu kod golf değil, kodunuzu yeniden biçimlendirerek okunabilirliğini artırabilir miyim? Ayrıca, BPP tarzı algoritmaların, en azından ek bellek kullanmadan, 2'nin gücü olan bazlarda pi için rakamları verebileceğini unutmayın.
Franki

@Franki kodu biçimlendirmek yazının anlamını veya amacını değiştirir mi? Değilse, iyi olmalı (ve düzenleme her zaman geri alınabilir). Bazı kodları deobcuscating yapmak nasıl netleştirmekten başka bir şey yapabilir, anlamıyorum.
11684

1
@syntaxerror Durmadan önce tam olarak 15.000 basamak üretmektir. İkinci döngüdeki çıktı 4 basamak pi üretir ve 52514 gizem sayısını 14 ile azaltır. Denklem daha sonra 4 * (52514/14) olur, bu da 15004'e eşittir. Dizideki son 14 değerin dikkate alınmaması gerekir. 15000 kesin değerimizi elde etmek için daha az sayıda jetonun avantajı.
Daniel Henneberger

1
@ 11684 Hayır, kodun anlamını veya amacını değiştirmez. Ancak, ben bu pi için BBP tarzı tıkaç algoritması, ama başkasının zaten burada gizlemesi ettiğini başka biri değil fark stackoverflow.com/a/25837097
Franki

2

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


1

İş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.


4
Soru, “kesinlikle kaç tane basılacağını belirtmek istiyorum” diyor, ki bu kesinlikle, kesinlikle belirsiz. senin ./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.
G-Man, 6:14 'te Monica'yı Yeniden Yerleştir'

Bellekten, scale=Xseçeneği bcsayı DEĞİLDİR, ancak X'inci ondalık basamağındaki sayıyı kesin.
sözdizimi

1

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

Fark ettiniz, 62 basamaklı skaladan sonra hepsi 0'dır, oysa bu orijinal komutla olmaz.

2
@ Amphiteót, Çünkü 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
ayarlarla

1

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.


Endişelendiğim kadarıyla, 4 * arctan(1)üç üç hanenin 2 rakamını hatırlamak daha kolay buluyorum ... 355 yerine 335, 113 yerine 133 kullanıyorum.
John WH Smith

Bence bu kişisel bir tercih meselesi. :) Telefon numaralarını kolayca ezberleyebilecek (sabit hat!) Telefon numaralarını tek bir telefon numarası olarak iki numarayı ezberleyebileceklerdir. Aynı zamanda okulda trigonometrinin kötü güçler tarafından yapılmış olması gerektiğini düşünenlere yardımcı olacaktır.
sözdizimi

1

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;

Önemsiz?

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:

Optimize

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

Avantajları

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.

En az

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

Hızlı

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.

printf uyumluluğu

Ç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ı.
Stéphane Chazelas 10:14
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.