मैं पीआई (3.14159) कैसे प्रिंट कर सकता हूं? [बन्द है]


35

मेरे लिए क्या कमांड प्रिंट कर सकता है? मैं यह निर्दिष्ट करना चाहता हूं कि यह कितने अंक प्रिंट करता है, मुझे ऑनलाइन कुछ भी नहीं मिला। मैं सिर्फ पीआई को प्रिंट करने में सक्षम होना चाहता हूं।


28
अपनी भाषाओं को चुनें: rosettacode.org/wiki/Pi
मार्क प्लॉटनिक

4
ध्यान दें कि यह अधिक मजेदार हो जाता है यदि आप लगभग 15. से अधिक अंक चाहते हैं
Thorbjørn Ravn Andersen

2
@DisplayName: इसका मतलब है कि अब आप किसी भी प्रोग्राम का उपयोग नहीं कर सकते जो आंतरिक रूप से स्टोर करता है / डबल सटीक फ्लोटिंग पॉइंट वैल्यू का उपयोग करके पीआई की गणना करता है (जो कि आमतौर पर सबसे अधिक सटीक "बिल्ट-इन" एफपी डेटा प्रकार अधिकांश भाषाओं में उपलब्ध है)।
मट्टियो इतालिया

5
मेरा समाधान, दशकों पहले यह आमतौर पर भाषा पुस्तकालयों द्वारा प्रदान किया गया था, इसे उन अस्थायी स्थानों की तुलना में अधिक याद रखना था जिनका मैं उपयोग कर रहा था, जिनकी कभी आवश्यकता होगी: 3.1415926535897932384626 आमतौर पर व्यावहारिक उद्देश्यों के लिए पर्याप्त करीब है, और यहां तक ​​कि सबसे अव्यावहारिक भी - कुछ भी वास्तविक -वर्ल्ड में अन्य नंबरों की तुलना में अधिक त्रुटि होने वाली है, और सैद्धांतिक के लिए मैं संख्यात्मक मूल्य के बजाय प्रतीकात्मक के साथ रहना चाहूंगा।
केश्लाम

3
@syntaxerror की रुचि अप्रासंगिक है। यदि आप मशहूर हस्तियों की नग्न तस्वीरों के लिए एक प्रश्न पोस्ट करना चाहते थे, तो इसे हजारों दृश्य मिलते थे और संभवत: यह बहुत अधिक होता था। यह विषय पर नहीं है। यह प्रश्न बहुत व्यापक का एक उत्कृष्ट उदाहरण है। बस जवाबों की संख्या को देखो। यह भी ध्यान दें कि ओपी ने किसी भी सीमा को निर्दिष्ट नहीं किया है जो संभावित उत्तर को अनिवार्य रूप से अनंत बनाता है। किसी भी मामले में, समापन नहीं हटा रहा है। सवाल और इसके सभी 23 जवाब अभी भी यहां होंगे। सिर्फ बंद करने का मतलब है कि कोई और जवाब स्वीकार नहीं किया जाता है। क्या हमें π प्रिंट करने के लिए और भी अधिक तरीकों की आवश्यकता है?
terdon

जवाबों:


52

आप इस कमांड का उपयोग कर सकते हैं:

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/


12
bashयहाँ और तार का समर्थन करने वाले अन्य शेलर संस्करण bc -l <<< "scale=5; 4*a(1)":।
पाबौक

2
मुझे आश्चर्य है कि यह कितने अंक जा सकता है?
डिस्प्लेनैम

4
@DisplayName काफी कुछ। scale=1000९९९ सही अंकों को जल्दी से देता है (अंतिम अंक १ से उचित है, क्योंकि हम पी / ४ की गणना कर रहे हैं और फिर ४ से गुणा कर रहे हैं)। scale=4000कुछ सेकंड में 4000 सही अंक देता है। scale=10000मेरे लिए धैर्य से अधिक समय लगता है, लेकिन संभवतः 9999 या 10000 सही अंक देता है।
hobbs

4
यह मेरी मशीन पर एक गलत परिणाम देता है, टाइपिंग 'इको "स्केल = 5; 4 * ए (1)" | bc -l 'रिटर्न 3.14156, जब अंतिम अंक 9
जॉर्डन बेंटले

1
@ जोर्डनबेंटली, मैंने परिणाम के सही गोलाई के साथ एक उत्तर जोड़ा है ।
पाबौक

61

यदि आपने tex(1)स्थापित किया है:

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

13
यह सिर्फ चालाक होने के लिए लगभग एक मूल्य है। जब आप पैकेज को अपग्रेड करते हैं तो इस का आउटपुट बदल जाता है। क्या हम इस बात पर विचार करेंगे कि सुविधा या बग होना चाहिए?
एक सीवीएन

8
@ माइकलकॉर्जलिंग दरअसल, यह पी के अधिक सटीक अनुमान होने के लिए बदल जाता है।
Abrixas2

@ Abrixas2 हाँ, मुझे पता है। TeX के अंतिम संस्करण के साथ संस्करण Te।
एक सीवीएन

30
@DavidRicherby कम अंकों के अतिरिक्त आह्वान के माध्यम से मुद्रित किया जा सकता है cut। अधिक अंकों को लंबे समय तक प्रतीक्षा करने और फिर से कमांड चलाने से मुद्रित किया जा सकता है।
स्टीवन डी

1
@ रोलन कार्यान्वयन पर निर्भर करता है। मैं इस विशेष मामले में उम्मीद करूंगा कि इसे "सही" किया जाएगा।
थोरबजोरन रावन एंडरसन

23

मनमानी परिशुद्धता के साथ मुद्रण के लिए, आप उपयोग कर सकते हैं bcऔर सूत्र pi = 4*atan(1):

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

2
विकल्प के बारे में कुछ अजीब हैscale , pi = 3.141592..लेकिन echo "scale=5; 4*a(1)" | bc -l => 3.14156फिर मैं देखने की उम्मीद करूंगा 3.14159?
fduff 21

7
scaleगणना के लिए उपयोग करने की सटीकता को निर्दिष्ट करता है, इसलिए scale=5, कोई भी ऑपरेशन किसी भी परमाणु संचालन के लिए पांच से अधिक भिन्न अंकों का उपयोग नहीं करेगा।
एब्रीकास 2


20

यदि आप कुछ ऐसा चाहते हैं जो then के मूल्य की गणना कर सकता है , तो कई दृष्टिकोण हैं। शायद सबसे स्पष्ट समाधान एक तैयार पैकेज जैसे pi(डेबियन पैकेज लिंक) का उपयोग करना होगा , जो कि अगर डेबियन के पैकेज विवरण पर भरोसा किया जाना है, तो एक मनमाना परिशुद्धता के लिए मूल्य की गणना कर सकते हैं, केवल मेमोरी द्वारा सीमित है।

piवास्तव में एक उदाहरण है जो CLN लाइब्रेरी (संख्याओं के लिए क्लास लाइब्रेरी) के साथ शामिल है । इसमें उदाहरण अनुप्रयोग शामिल हैं जो पाई, फाइबोनैचि आदि जैसे संख्याओं की मनमानी लंबाई उत्पन्न करने के लिए उपकरण प्रदान करते हैं, सीएलएन पैकेज डेबियन / उबंटू में पूर्व-पैक किए गए उपलब्ध हैं (यह ऊपर दिए गए डेबियन लिंक को इंगित कर रहा है)।

उदाहरण
$ ./pi 10
3.141592653

$ ./pi 20
3.1415926535897932384

नोट: इन उदाहरणों का स्रोत यहाँ CLN कोड आधार के लिए स्रोत में है

अन्य विकृतियां

फेडोरा

फेडोरा पर मुझे स्रोत टरबॉल को डाउनलोड करना और इसे स्वयं बनाना था, लेकिन यह थोड़ा उपद्रव के साथ बनाता है। clnफेडोरा पर जो भी कारण के लिए पैकेज में सिर्फ लाइब्रेरी शामिल है लेकिन डेबियन / उबंटू संस्करण (ऊपर) में उपलब्ध उदाहरणों की उपेक्षा करता है।

मेहराब

आर्क में एक ही कार्यक्रम प्रदान करता है पैकेज (धन्यवाद Amphiteót )।cln


हाँ, हे, मेरा मतलब था कि मेरे सिर में जो मैंने लिखा था उसका कुल मूल्य था।
डिस्प्लेनेम

2
"कुल मूल्य" ?? क्या मतलब...?
काइल स्ट्रैंड

2
@DisplayName ने बाकी जवाब पढ़ा। piजैसा आप चाहते हैं वैसा ही एक समर्पित कार्यक्रम लगता है। आप pi 300उदाहरण के लिए पहले 300 अंकों को प्रिंट करना पसंद कर सकते हैं ।
terdon

3
@KyleStrand मैंने उस पर सही मायने में अद्भुत उत्तर खोजा है, जिसमें यह टिप्पणी सम्‍मिलित है। हे, यह Fermat के लिए काम किया !
terdon

मुझे यह जानकर अच्छा लगेगा कि इसमें दो गिरावट क्यों आई हैं। क्या जिन लोगों ने जवाब नहीं दिया, उन्होंने जवाब दिया कि इससे पहले कि वे उपयोगी नहीं थे, उन्होंने जवाब नहीं दिया?
एक सीवीएन

17

एक लाख अंकों तक के लिए आप निम्नलिखित का उपयोग कर सकते हैं (यहां 3000 अंकों के लिए):

curl --silent http://www.angio.net/pi/digits/pi1000000.txt | cut -c1-3000

2
इसका अतिरिक्त लाभ यह है कि यह यथोचित रूप से O (1) जटिलता के करीब होना चाहिए। या हो सकता है कि सभी के बाद एक लाभ नहीं है ...
एक CVn

7
इसके अलावा, यह कहना मुश्किल है कि किसी भी व्यावहारिक दुनिया में ओ (1) समय जटिलता है। : पी
हालोसगॉस्ट

2
@HalosGhost हमारे उद्देश्यों के लिए ( प्रत्येक बार पीआई के एन अंकों की गणना करने की तुलना में ), एक नेटवर्क पर एक विशिष्ट सर्वर से डेटा की एक निश्चित मात्रा को डाउनलोड करने की संभावना प्रभावी रूप से ओ (1) है, जबकि पी के एन अंकों की गणना करने की संभावना है कम से कम ओ (लॉग एन) जैसी कुछ और संभवतः उच्चतर (मैं उन एल्गोरिदम से परिचित नहीं हूं)। डेटा का वास्तविक डाउनलोड डाउनलोड शुरू करने के लिए ओवरहेड की तुलना में अधिक समय लेने की संभावना है, इसलिए डाउनलोड का समय हावी है और आप ओ (1) के आसपास के क्षेत्र में कहीं न कहीं एक निश्चित डेटा ट्रांसमिशन दर को देखते हुए प्राप्त करते हैं। इसलिए ओ (1)।
बजे एक CVn

4
@ माइकलकॉर्जलिंग जब आप कहते हैं कि O (1) का वास्तव में O (n) नहीं है? आपके द्वारा आवश्यक अंकों की संख्या में रैखिक में डाउनलोड का समय, इसलिए ओ (एन)।
कोडइन्चोस

1
@CodesInChaos नहीं, डाउनलोड समय स्थिर है (निरंतर संचरण दर दी गई है) क्योंकि आप अंकों की निरंतर संख्या (एक मिलियन, यहां) डाउनलोड कर रहे हैं। जब तक (इस विशिष्ट मामले में) कर्ल स्मार्ट होता है, तो डाउनलोड करते समय प्रिंट करना बंद कर देता है और पाइप के cutबाहर निकल जाने के बाद डाउनलोड करना बंद कर देता है? अगर ऐसा है, तो मैं मानता हूं, यह O (n) होगा।
बजे एक सीवीएन

15

कुछ अन्य उत्तर आउटपुट के अंतिम स्थानों पर गलत अंक दिखाते हैं। नीचे उत्तर का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
गोलाई के उद्देश्य के लिए तीन अतिरिक्त अंकों की गणना "सही गोलाई" नहीं है जैसा कि आप एक टिप्पणी में दावा करते हैं। सबसे पहले, आप गणना की त्रुटि पर बाध्य नहीं है। यदि अंतिम स्थान पर 3 इकाइयों द्वारा गलत किया जा सकता है, जैसा कि fduff द्वारा दावा किया गया है, तो अंतिम स्थान पर 1000 इकाइयों द्वारा गलत क्यों नहीं होगा? दूसरा, "तालिका निर्माता की दुविधा" देखें।
जटिल

12

perl एक लाइन ( bignum का उपयोग करके ):

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

जैसे

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

10.000 अंकों के लिए: पर्ल में 8 मिनट के करीब, बीसी में 4 से कम। सबसे तेज नहीं।
इसहाक

9

अजगर 2 के साथ:

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

4
पूर्णता के लिए, यह समाधान python2- विशिष्ट है।
२०:३६ पर हेलोजगॉस्ट

संपादन के बाद, (..)पायथन 2 और 3 में यह काम करता है। केवल 12 अंक होने लगते हैं।
एंथन

-C $ अजगर "आयात गणित, प्रिंट (प्रारूप (math.pi, '.400f'))" 3,1415926535897931159979634685441851615905761718750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
आर्टेम Shitov

1
@ArtemShitov - मेरा बुरा, gmpy2 आयात करने का प्रयास करें (यदि आपने इसे स्थापित किया है) python -c "import gmpy2; print(str(gmpy2.const_pi(8192))[:400])":। अधिक अंकों के लिए सटीकता बढ़ाएँ ... जैसेpython -c "import gmpy2; print(str(gmpy2.const_pi(16384))[:4400])"
don_crissti

1
सबसे तेज़ मुझे from mpmath import mp; mp.dps = 1000000 ; print(mp.pi)एक मिलियन अंकों के लिए कुछ सेकंड का समय मिल सकता था । बिल्कुल बुरा नही !!!।
इसहाक

7

रूबी का उपयोग करना:

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

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

3.141592654

1
एक लाइनर:ruby -e 'require "bigdecimal"; require "bigdecimal/math"; include BigMath; puts BigDecimal(PI(100)).round(9).to_s("F")'

4

बैश में:

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

@ Amphiteóth afmtoditको groffस्थापित करने की आवश्यकता है। यहाँ उबंटू (और स्वाद) पर, यह मानक नहीं है। JFYI।
वाक्यविन्यास

@syntaxerror धन्यवाद, अच्छी बात! मैंने अपना उदाहरण निकाल दिया है। मेरी बात सिर्फ तब थी जब इस एआई grepको मेरे सिस्टम ने निरंतर खोजते हुए चलाया और इसे एक से अधिक स्थानों पर पाया। इसलिए यह मेरे लिए +1 था!


3

मुझे यह सवाल कैसे याद आया ...

यहाँ मेरा एक छोटा सा पायथन कार्यक्रम है जो मैंने कुछ हफ़्ते पहले स्टैक ओवरफ़्लो पर पोस्ट किया था। यह विशेष रूप से तेज़ नहीं है, लेकिन यह बहुत सारे अंक कर सकता है । :) हालांकि, जैसा कि मैंने उस धागे में उल्लेख किया है, मैं आम तौर पर मनमाने ढंग से सटीक अंकगणित के लिए पायथन के 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 के बाद) का प्रयास करें । बिल्कुल बुरा नही !!!।
इसहाक

2

यदि आपने 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

4
छोटा node -e 'console.log(Math.PI)'अपने सबसे अच्छे से थोड़ा बेहतर है।
chbrown

1
@chbrown कि ओपी "गंभीर नहीं" आवश्यकता को पूरा नहीं करता है।
पॉल

1
"गंभीर नहीं" आवश्यकता क्या है? ओपी ने सिर्फ इतना कहा कि वे मज़े के लिए पूछ रहे हैं कि वे ऐसे उत्तर चाहते हैं जो किसी भी तरह "गंभीर नहीं" हों। वैसे भी इसका क्या मतलब है? कुछ पसंद है echo pie?
terdon

मैंने वह टाइप किया क्योंकि जब आप प्रश्न पूछते हैं तो कभी-कभी लोग कहते हैं कि "यह एक पटकथा लेखन का कारखाना नहीं है", इसलिए मैंने कहा कि क्योंकि इसके लिए कोई वास्तविक कारण नहीं है, मैं सिर्फ यह जानना चाहता हूं कि पीआई कैसे प्रिंट करना है।
डिस्प्लेनेम

@ Amphiteóth मेरे कंप्यूटर पर चलने में लगभग 20 सेकंड लगते हैं। आपको बस इसे कुछ समय देने की आवश्यकता हो सकती है।
पॉल

2

मोंटे कार्लो विधि

उदाहरण के लिए, यह देखें इस विधि के लिए स्पष्टीकरण।

चेतावनियां

  • मनमाने ढंग से सटीक नहीं
  • किसी भी चीज को उपयोगी बनाने के लिए एक लंबा समय लगता है

लाभ

मज़ा :-)

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बचने या कम से कम छद्म यादृच्छिक अनुक्रम की अवधि लंबी हो जाएगी। यह सब अनुमान है, इसलिए अगर मैं गलत हूं तो मुझे सुधारने के लिए स्वतंत्र महसूस करें।


@ Amphiteót वास्तव में यकीन नहीं है कि वहाँ क्या हो रहा है। यदि यह मेरी Perl को v5.14.2 में मदद करता है। मैं वास्तव bignumमें पर्ल के संचालन से अच्छी तरह से वाकिफ नहीं हूं , मुझे डर है और मुझे उपरोक्त कार्यक्रम के किसी विशेष हिस्से के बारे में नहीं पता है जिसके लिए एक नए एलएल की आवश्यकता है। वैसे भी, इस बारे में जो दिलचस्प है वह एल्गोरिथम ही है। अपनी पसंद की भाषा में इसे लागू करने का प्रयास करें यदि यह पर्ल आपके लिए काम नहीं कर रहा है।
जोसेफ आर।

1
@ Amphiteót मैं देख रहा हूँ। क्या संपादन आपकी समस्या का समाधान करता है?
जोसेफ आर।

@ Amphiteót आप ($x,$y,$circle,$not_circle)=(0,0,0);यह सुनिश्चित करने के लिए कि उपयोग किए जाने से पहले सभी चर परिभाषित किए जाते हैं, लूप से पहले जोड़ने का प्रयास कर सकते हैं।
जोसेफ आर।

@ Amphiteót मेरी गलती। ऊपर के परगने होने चाहिए थे (0,0,0,0)
जोसेफ आर।

इसे पुनः लिखें / 5.20.1: समझ में आता है, लेकिन इसे नहीं देखा! वास्तव में ($x,$y,$circle,$not_circle)=(0,0,0,0)। एक या दो मिनट के बाद यह वांछित मूल्य के चारों ओर लटका हुआ था, फिर मेरे रुकने से पहले यह 3.1409 के करीब चला गया। दिलचस्प और मजेदार! धन्यवाद!

2

आप पाई के लिए एक स्पिगोट एल्गोरिथ्म का उपयोग कर सकते हैं। 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;}

प्रसंग: विकि , यहाँ और यहाँ

1
मुझे Borwein, Bailey और Plouffe द्वारा लघुगणक स्थिरांक के लिए स्पिगोट एल्गोरिथ्म पसंद है, हालाँकि, यह कोड गोल्फ नहीं है, इसलिए क्या मैं इसे सुधार कर आपके कोड की पठनीयता में सुधार कर सकता हूँ? यह भी ध्यान दें कि बीपीपी-शैली के एल्गोरिदम केवल उन आधारों में पाई के लिए अंक का उत्पादन कर सकते हैं जो 2 की शक्तियां हैं, कम से कम अतिरिक्त मेमोरी का उपयोग किए बिना।
फ्रेंकी

@Franki कोड को फॉर्मेट करने से पोस्ट का अर्थ या इरादा बदल जाता है? यदि नहीं, तो यह ठीक होना चाहिए (और संपादन को हमेशा पीछे ले जाया जा सकता है)। मैं यह नहीं देखता कि कुछ कोड को स्पष्ट करने के अलावा कुछ और कैसे किया जा सकता है।
11684

1
@syntaxerror इसे रोकने से पहले 15,000 अंकों का उत्पादन करना है। दूसरे फॉर-लूप में आउटपुट पीआई के 4 अंक उत्पन्न करता है और 14.14 तक 52514 की रहस्य संख्या को घटाता है। समीकरण तब 4 * (52514/14) होगा जो 15004 के बराबर होता है। सरणी में अंतिम 14 मानों को लेने के लिए अनदेखा किया जाता है। 15000 के हमारे सटीक मूल्य को प्राप्त करने के लिए कम टोकन का लाभ।
डैनियल हेनेबर्गर 21

1
@ 11684 नहीं, यह वास्तव में कोड का अर्थ या इरादा नहीं बदलेगा। हालांकि, मुझे एहसास हुआ कि यह अनुकरणीय लिए एक BBP शैली पानी की कल एल्गोरिथ्म, लेकिन एक और एक है कि किसी और पहले से ही यहाँ deobfuscated गया है stackoverflow.com/a/25837097
Franki

2

पीएचपी

कुछ उदाहरण:

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 को कम से कम एक हजार अंकों की गणना कर सकता है


1

यहाँ एक स्क्रिप्ट है जो उपयोगकर्ता द्वारा निर्दिष्ट अंकों ('।') के साथ पाई को प्रिंट करता है।

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

अंतिम अंक पर ध्यान दें।


4
प्रश्न कहता है, "मैं यह निर्दिष्ट करना चाहता हूं कि यह कितने अंक प्रिंट करता है," जो, सख्ती से बोल रहा है, अस्पष्ट है - लेकिन मुझे लगता है कि किसी उचित व्याख्या के तहत आपका जवाब विफल हो जाता है (एक तकनीकी पर); आपके ./pi.sh 10अंक नौ अंक हैं, प्रारंभिक की गिनती 3। इसके अलावा, आप गोलाई की त्रुटि की ओर इशारा कर रहे हैं, लेकिन आपके ./pi.sh 6आउटपुट 3.1415, जो इष्टतम नहीं हो सकते हैं।
जी-मैन का कहना है कि 'मोनिका' को

मेमोरी से, नंबर का scale=Xविकल्प bcगोल नहीं होगा, लेकिन बस X-th दशमलव अंक में नंबर काट दें।
वाक्य रचना

1

मुझे अबे का जवाब पसंद है लेकिन यह पसंद नहीं है कि कैसे बीसी अंतिम अंक को बदल रहा है।

echo "scale=5; 4*a(1)" | bc -l
3.14156

इसलिए मैंने अंकों की संख्या निर्धारित करने के लिए प्रिंट किए गए पैमाने का उपयोग किया।

printf "%0.5f\n" $(echo "4*a(1)" | bc -l)
3.14159

क्या आपने देखा है, 62 अंकों के पैमाने के बाद, वे सभी 0 हैं, जबकि मूल कमांड के साथ ऐसा नहीं होता है।

2
@ Amphiteót, ऐसा इसलिए है क्योंकि printfइसकी तुलना में फ्लोटिंग पॉइंट नंबरों पर एक गंभीर सीमा है bc। वे लगभग 17 अंकों की सटीकता के साथ C भाषा doubleप्रकार द्वारा दर्शाए गए हैं, इसलिए लगभग 17 अंकों के बाद भी शून्य अंक फर्जी हैं! ------ मैंने परिणाम के सही गोलाई के साथprintf एक उत्तर जोड़ा है । ------ यह सुनिश्चित करने के लिए भी कि यह कमांड विभिन्न स्थानों के साथ काम करता है, आपको कुछ इस तरह करना चाहिए: LC_ALL=C printf...
pabouk

1

यदि आप इस जीवन को याद नहीं रखते हैं तो आप क्या कर सकते हैं 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।
जॉन डब्ल्यूएच स्मिथ

ठीक है, मुझे लगता है कि यह व्यक्तिगत प्राथमिकता की बात है। :) लोग (मेरे जैसे) जो आसानी से याद कर सकते हैं (लैंडलाइन!) फोन नंबर केवल एक ही फोन नंबर के रूप में दो संख्याओं को याद कर पाएंगे। यह उन लोगों की भी मदद करेगा जो स्कूल में महसूस करते थे कि त्रिकोणमिति को अनिष्ट शक्तियों द्वारा बनाया गया है।
वाक्यविन्यास

1

यह माना जा सकता है कि ओपी को 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 %.5szsh (समझदारी से, लेकिन POSIX के खिलाफ) में चार (बाइट नहीं) है। ksh93के %.5Lsgraphem आधारित है।
स्टीफन चेजेलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.