मेरे लिए क्या कमांड प्रिंट कर सकता है? मैं यह निर्दिष्ट करना चाहता हूं कि यह कितने अंक प्रिंट करता है, मुझे ऑनलाइन कुछ भी नहीं मिला। मैं सिर्फ पीआई को प्रिंट करने में सक्षम होना चाहता हूं।
मेरे लिए क्या कमांड प्रिंट कर सकता है? मैं यह निर्दिष्ट करना चाहता हूं कि यह कितने अंक प्रिंट करता है, मुझे ऑनलाइन कुछ भी नहीं मिला। मैं सिर्फ पीआई को प्रिंट करने में सक्षम होना चाहता हूं।
जवाबों:
आप इस कमांड का उपयोग कर सकते हैं:
echo "scale=5; 4*a(1)" | bc -l
3.14159
जहां दशमलव बिंदु के बाद पैमाने अंकों की संख्या है।
संदर्भ: 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
९९९ सही अंकों को जल्दी से देता है (अंतिम अंक १ से उचित है, क्योंकि हम पी / ४ की गणना कर रहे हैं और फिर ४ से गुणा कर रहे हैं)। 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
, कोई भी ऑपरेशन किसी भी परमाणु संचालन के लिए पांच से अधिक भिन्न अंकों का उपयोग नहीं करेगा।
यदि आप कुछ ऐसा चाहते हैं जो then के मूल्य की गणना कर सकता है , तो कई दृष्टिकोण हैं। शायद सबसे स्पष्ट समाधान एक तैयार पैकेज जैसे pi
(डेबियन पैकेज लिंक) का उपयोग करना होगा , जो कि अगर डेबियन के पैकेज विवरण पर भरोसा किया जाना है, तो एक मनमाना परिशुद्धता के लिए मूल्य की गणना कर सकते हैं, केवल मेमोरी द्वारा सीमित है।
pi
वास्तव में एक उदाहरण है जो CLN लाइब्रेरी (संख्याओं के लिए क्लास लाइब्रेरी) के साथ शामिल है । इसमें उदाहरण अनुप्रयोग शामिल हैं जो पाई, फाइबोनैचि आदि जैसे संख्याओं की मनमानी लंबाई उत्पन्न करने के लिए उपकरण प्रदान करते हैं, सीएलएन पैकेज डेबियन / उबंटू में पूर्व-पैक किए गए उपलब्ध हैं (यह ऊपर दिए गए डेबियन लिंक को इंगित कर रहा है)।
$ ./pi 10
3.141592653
$ ./pi 20
3.1415926535897932384
नोट: इन उदाहरणों का स्रोत यहाँ CLN कोड आधार के लिए स्रोत में है ।
फेडोरा पर मुझे स्रोत टरबॉल को डाउनलोड करना और इसे स्वयं बनाना था, लेकिन यह थोड़ा उपद्रव के साथ बनाता है। cln
फेडोरा पर जो भी कारण के लिए पैकेज में सिर्फ लाइब्रेरी शामिल है लेकिन डेबियन / उबंटू संस्करण (ऊपर) में उपलब्ध उदाहरणों की उपेक्षा करता है।
आर्क में एक ही कार्यक्रम प्रदान करता है पैकेज (धन्यवाद Amphiteót )।cln
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
अजगर 2 के साथ:
$ python -c "import math; print(str(math.pi)[:7])"
3.14159
(..)
पायथन 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)
एक मिलियन अंकों के लिए कुछ सेकंड का समय मिल सकता था । बिल्कुल बुरा नही !!!।
बैश में:
$ read -a a <<< $(grep M_PIl /usr/include/math.h) ; echo ${a[3]} | tr -d L
3.141592653589793238462643383279502884
afmtodit
को groff
स्थापित करने की आवश्यकता है। यहाँ उबंटू (और स्वाद) पर, यह मानक नहीं है। JFYI।
बिल्ट इन पीआई () फ़ंक्शन का उपयोग करके PHP में बहुत सरल:
<?php
echo round(pi(), 2);
?>
मुझे यह सवाल कैसे याद आया ...
यहाँ मेरा एक छोटा सा पायथन कार्यक्रम है जो मैंने कुछ हफ़्ते पहले स्टैक ओवरफ़्लो पर पोस्ट किया था। यह विशेष रूप से तेज़ नहीं है, लेकिन यह बहुत सारे अंक कर सकता है । :) हालांकि, जैसा कि मैंने उस धागे में उल्लेख किया है, मैं आम तौर पर मनमाने ढंग से सटीक अंकगणित के लिए पायथन के mpmath मॉड्यूल का उपयोग करता हूं, और mpmath में एक तेज़ तेज़ निर्माता है।
उदाहरण के लिए,
time python -c "from mpmath import mp;mp.dps=500000;print mp.pi" >bigpi
real 0m4.709s
user 0m4.556s
sys 0m0.084s
5 सेकंड के भीतर पीआई के 500000 दशमलव भी जर्जर नहीं है, IMHO, यह विचार करते हुए कि यह एक मशीन पर चल रहा है एक सिंगल 2GHz प्रोसेसर, 2 गीगा रैम, और एक बुजुर्ग आईडीई ड्राइव पर लिख रहा है।
from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)
एक लाख अंकों के लिए दो सेकंड के तहत (pip3 स्थापित mpmath के बाद) का प्रयास करें । बिल्कुल बुरा नही !!!।
यदि आपने node.js
स्थापित किया है, तो यह आपके लिए पाई खोजने में अपना सर्वश्रेष्ठ प्रदर्शन करेगा, हालांकि इसका सर्वश्रेष्ठ बहुत अच्छा नहीं है:
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
में पर्ल के संचालन से अच्छी तरह से वाकिफ नहीं हूं , मुझे डर है और मुझे उपरोक्त कार्यक्रम के किसी विशेष हिस्से के बारे में नहीं पता है जिसके लिए एक नए एलएल की आवश्यकता है। वैसे भी, इस बारे में जो दिलचस्प है वह एल्गोरिथम ही है। अपनी पसंद की भाषा में इसे लागू करने का प्रयास करें यदि यह पर्ल आपके लिए काम नहीं कर रहा है।
($x,$y,$circle,$not_circle)=(0,0,0);
यह सुनिश्चित करने के लिए कि उपयोग किए जाने से पहले सभी चर परिभाषित किए जाते हैं, लूप से पहले जोड़ने का प्रयास कर सकते हैं।
(0,0,0,0)
।
($x,$y,$circle,$not_circle)=(0,0,0,0)
। एक या दो मिनट के बाद यह वांछित मूल्य के चारों ओर लटका हुआ था, फिर मेरे रुकने से पहले यह 3.1409 के करीब चला गया। दिलचस्प और मजेदार! धन्यवाद!
आप पाई के लिए एक स्पिगोट एल्गोरिथ्म का उपयोग कर सकते हैं। Dik Winter और Achim Flammenkamp द्वारा निम्नलिखित C प्रोग्राम पीआई के पहले 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 -r "print pi();"
php -r 'echo M_PI;'
echo "<?=pi();" | php
यदि आप सटीक प्रयास को बदलना चाहते हैं:
php -d precision=100 -r 'echo pi();'
एक फ्लोट का आकार प्लेटफ़ॉर्म-निर्भर है, हालांकि अधिकतम 14 दशमलव अंकों की सटीकता के साथ अधिकतम ~ 1.8e308 एक सामान्य मूल्य (64 बिट IEEE प्रारूप) है। [और पढो]
यदि आप और भी सटीक सटीकता की तलाश कर रहे हैं, तो कुछ प्रोग्रामिंग समाधानों के लिए रोसेटा कोड या कोड गोल्फ एसई देखें ।
संबंधित: सॉफ्टवेयर जो 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
आउटपुट 3.1415
, जो इष्टतम नहीं हो सकते हैं।
scale=X
विकल्प bc
गोल नहीं होगा, लेकिन बस X-th दशमलव अंक में नंबर काट दें।
मुझे अबे का जवाब पसंद है लेकिन यह पसंद नहीं है कि कैसे बीसी अंतिम अंक को बदल रहा है।
echo "scale=5; 4*a(1)" | bc -l
3.14156
इसलिए मैंने अंकों की संख्या निर्धारित करने के लिए प्रिंट किए गए पैमाने का उपयोग किया।
printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159
printf
इसकी तुलना में फ्लोटिंग पॉइंट नंबरों पर एक गंभीर सीमा है bc
। वे लगभग 17 अंकों की सटीकता के साथ C भाषा double
प्रकार द्वारा दर्शाए गए हैं, इसलिए लगभग 17 अंकों के बाद भी शून्य अंक फर्जी हैं! ------ मैंने परिणाम के सही गोलाई के साथprintf
एक उत्तर जोड़ा है । ------ यह सुनिश्चित करने के लिए भी कि यह कमांड विभिन्न स्थानों के साथ काम करता है, आपको कुछ इस तरह करना चाहिए: LC_ALL=C printf
...
यदि आप इस जीवन को याद नहीं रखते हैं तो आप क्या कर सकते हैं arctan
? या मान लें कि आपको पता नहीं है कि यह फ़ंक्शन मौजूद है bc
, तो इस सरल विभाजन को याद करने का प्रयास करें:
echo "scale=6; 355 / 113" | bc
3.141592
केवल 6 अंकों के लिए काम करेगा, लेकिन गैर-वैज्ञानिक गणना के लिए यह ठीक होगा।
अगर आपको लगता है कि आप इन दो नंबरों को याद नहीं रख सकते हैं, तो पहले भाजक लिखें, फिर अंश:
113 355
या क्यों नहीं
११ ३३ ५५
"डबल 1, डबल 3, डबल 5"। सभी आंकड़े विषम हैं। गणना करने के लिए, 6 अंकों की संख्या को फिर से आधे में विभाजित करें, और उन्हें विभाजित करने से पहले भाजक और अंश को स्वैप करें। यह इसके बारे में।
4 * arctan(1)
यह याद रखना बहुत आसान है कि 2 तीन अंकों की संख्या ... मैं 355 के बजाय 335 का उपयोग करूंगा, या 113 के बजाय 133।
यह माना जा सकता है कि ओपी को interested प्रिंट करने के लिए शेल कमांड को याद करने में आसान, आसान, लेकिन सवाल यह है कि वास्तव में ऐसा नहीं कहा गया है। यह उत्तर उस धारणा को अनदेखा कर रहा है और लिखित रूप में प्रश्न का सख्ती से उत्तर देता है;
जबकि पहले से ही 18 उत्तर हैं, एक दृष्टिकोण अभी भी गायब है - और इतने सारे उत्तर के साथ, यह सोच सकता है कि यह एकमात्र ऐसा नहीं है जो गायब है:
तुच्छ एक: प्रिंट कैसे करें? बस प्रिंट π!
यह दृष्टिकोण इसके बारे में सोचने के लिए बहुत ही बेकार लगता है, लेकिन मैं यह दिखाऊंगा कि इसके पास यह गलतियाँ हैं:
हम सामान्य रूप से π के मूल्य की गणना करेंगे। मैं यह नहीं देखता कि मूल्य को पहले से निर्धारित करके, समाधान का अनुकूलन करने से हमें क्या रखना है - यह एक स्थिर है, कोई भी संकलक ऐसा करेगा।
हम अधिकतम संख्या तक We के कुछ अंक चाहते हैं। इसलिए हम पाठ के रूप में स्थिरांक का उपसर्ग ले सकते हैं:
echo 3.1415926535897932384626433832795 | cut -b -7
3.14159
सटीक के लिए एक स्पष्ट तर्क के साथ एक प्रकार, उदाहरण के लिए। परिशुद्धता के लिए 5
:
echo 3.1415926535897932384626433832795 | cut -b -$((2+5))
3.14159
अन्य उत्तर में से किसी एक का उपयोग करके गणना की गई उपयुक्त स्थिरांक का उपयोग करके अधिकतम परिशुद्धता को मनमाने ढंग से चुना जा सकता है। यह केवल एक कमांड लाइन की अधिकतम लंबाई तक सीमित है।
मूल्य खोजने के लिए इसमें निरंतर समय की जटिलता है।
यह कार्यान्वयन की कम जटिलता के आधार पर सभी सीमाओं और बाधाओं को स्पष्ट करता है।
यह पूर्ण उपलब्ध परिशुद्धता (निरंतर अनुगामी के साथ 0
) में स्थिर लौटकर सटीक रूप से अधिकतम इनायत से बड़ा सटीकता को संभालता है ।
तो यह समाधान, तुच्छ होने पर, फायदे हैं। उदाहरण के लिए, शेल फ़ंक्शन में उपयोग किए जाने पर यह उपयोगी हो सकता है।
ऊपर दिए गए समाधान की कार्यक्षमता को एक प्रक्रिया के लिए बनाए बिना भी कार्यान्वित किया जा सकता है cut
(यह मानकर echo
एक शेल बिलिन है)। यह 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
आम खोलों में शेल शेल होता है bash
और zsh
, यह कोई प्रक्रिया नहीं बनाता है।
इसके अलावा, यह किसी भी प्रकार के फ्लोटिंग पॉइंट संबंधित कोड को नहीं छूता है, लेकिन केवल बाइट सरणियों का हेरफेर (स्पष्ट रूप से मल्टीबीयर अक्षर नहीं)। यह आमतौर पर तेज होता है, अक्सर फ्लोटिंग पॉइंट के उपयोग से बहुत तेज होता है।
सुसंगतता या अनुकूलता की गारंटी देने के लिए अक्सर कारण बदल printf
जाते हैं /usr/bin/printf
। इस मामले में, मुझे लगता है कि हम बिलिन का उपयोग कर सकते हैं - जो महत्वपूर्ण है, क्योंकि उपयोग /usr/bin/printf
करने से एक प्रक्रिया के लिए "फास्ट" लाभ कम हो जाता है। संगतता के
साथ एक आम समस्या printf
लोकल के आधार पर संख्या आउटपुट स्वरूप है। स्थानीय सेटिंग के आधार पर .
संख्याओं के लिए पृथक्करण को बदला जा सकता है ,
; लेकिन हम संख्याओं का उपयोग नहीं करते हैं, बस एक स्ट्रिंग स्थिर है जिसमें शाब्दिक है .
- लोकेल द्वारा अप्रभावित।
स्टीफनचेलजेलस ने बताया किprintf %.5s
अलग तरीके से काम करता हैzsh
, वर्णों की गिनती करके, हमेशा की तरह बाइट्स नहीं। सौभाग्य से, हमारे स्थिरांक कम ASCII- श्रेणी में केवल वर्णों का उपयोग करते हैं, जो कि किसी भी प्रासंगिक एन्कोडिंग में प्रति वर्ण एक बाइट द्वारा एन्कोडेड है, जब तक कि हम UTF-8
यूनिकोड के लिए सामान्य एन्कोडिंग का उपयोग करते हैं , और एक निश्चित चौड़ाई एन्कोडिंग नहीं।
printf %.5s
zsh (समझदारी से, लेकिन POSIX के खिलाफ) में चार (बाइट नहीं) है। ksh93
के %.5Ls
graphem आधारित है।