2011-06-19 16 views
40

मैं एक प्रोग्राम है जो पीआई aproximate और मैं लंबे उपयोग करने के लिए कोशिश कर रहा हूँ कर रहा हूँ, लेकिन यह काम नहीं कर रहा है। क्योंकि% d एक पूर्णांकलंबे printf कैसे

typedef कि तुम क्या है यहाँ कोड

#include<stdio.h> 
#include<math.h> 
typedef long long num; 
main(){ 
    num pi; 
    pi=0; 
    num e, n; 
    scanf("%d", &n); 
    for(e=0; 1;e++){ 
     pi += ((pow((-1.0),e))/(2.0*e+1.0)); 
     if(e%n==0) 
     printf("%15lld -> %1.16lld\n",e, 4*pi); 
     //printf("%lld\n",4*pi); 
    } 
} 
+1

मुझे लगता है कि आपकी समस्या 'printf' की तुलना में' scanf' के साथ अधिक है। – Nemo

+0

'पाउ ((- 1.0), ई)' ई% 2 के रूप में बेहतर बेहतर होगा? 1: -1' –

उत्तर

-1

सबसे पहले है,% d एक int

तो %1.16lld के लिए है, कोई मतलब नहीं है, यह भी अनावश्यक है , सीधे प्रकार का उपयोग करें, एक और अधिक पठनीय कोड बनाता है।

क्या आप उपयोग करना चाहते प्रकार double, अनुकरणीय की गणना और फिर %f या %1.16f उपयोग करने के लिए है।

+0

यह वास्तव में "अवैध" नहीं है ... यह एमएसवीसी-विशिष्ट है, मुझे लगता है। – Mehrdad

+2

@Mehrdad जब से पूर्णांक संख्याओं में दशमलव अंक हैं? –

+6

गलत। [Printf के लिए spec] पढ़ें (http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html)। '% lld' बिल्कुल ठीक है कि आप 'लंबे समय तक' कैसे प्रिंट करते हैं। (बेशक, '1.16' जो भी आप चाहते हैं वह नहीं कर सकता ... लेकिन यह पूरी तरह से मान्य है। इसका मतलब है कि न्यूनतम फ़ील्ड चौड़ाई 1 का उपयोग करें और 16 अंकों को मुद्रित करें।) – Nemo

53

%lld मानक C99 तरीका है, लेकिन यह है कि संकलक है कि मैं (mingw32-जीसीसी v4.6.0) का उपयोग कर रहा पर काम नहीं करता। जिस तरह से इस संकलक पर यह करने के लिए है: %I64d

तो यह प्रयास करें:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi); 

और

scanf("%I64d", &n); 

एक ही रास्ता मैं के बारे में पता एक पूरी तरह से पोर्टेबल तरह से ऐसा करने के लिए है के लिए <inttypes.h> में परिभाषित का उपयोग करें।

आपके मामले में, यह इस तरह दिखेगा:

scanf("%"SCNd64"", &n); 
//...  
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi); 

यह वास्तव में बहुत बदसूरत है ... लेकिन कम से कम यह पोर्टेबल है।

+7

यह आपका कंपाइलर नहीं है लेकिन आपकी सी लाइब्रेरी यहां जिम्मेदार है। आप माइक्रोसॉफ्ट सी लाइब्रेरी का उपयोग कर रहे हैं, जो '% lld' का समर्थन नहीं करता है, जो एक सी 99 सुविधा है (हालांकि यह 'inttypes.h' है)। – caf

+0

अधिक विशिष्ट होने के लिए, यह msvcrt.dll है, जो सी मानक लाइब्रेरी का प्राचीन (लगभग 1998) संस्करण है जिसे मूल रूप से वीसी ++ 6.0 के लिए लिखा गया था, और विंडोज के साथ जहाजों को पिछड़ा संगतता उद्देश्यों के लिए लिखा गया था। MinGW उस प्राचीन संस्करण का उपयोग करता है, क्योंकि यह एकमात्र ऐसा है जो विंडोज के साथ बॉक्स से बाहर आता है। लेकिन आधुनिक वीसी ++ रनटाइम हैंडल '% lld' ठीक से संभालता है। –

+0

विजुअल सी ++ 2013% lld प्रारूप तत्व – user1741137

2
  • आपके scanf() कथन को भी %lld का उपयोग करने की आवश्यकता है।
  • आपका पाश एक समाप्त हालत नहीं है।
  • अभिव्यक्ति

    pi += pow(-1.0, e)/(2.0*e + 1.0); 
    
  • में अभी तक भी कई कोष्ठकों और अभी तक बहुत कुछ रिक्त स्थान हैं आप पाश की पहली यात्रा पर एक जोड़ने के लिए, और उसके बाद शून्य 'अनुकरणीय' का मान करने के लिए; यह मूल्य को ज्यादा नहीं बदलता है।
  • आप main() के लिए int की एक स्पष्ट वापसी प्रकार का उपयोग करना चाहिए।
  • कुल मिलाकर, यह जब यह अपने तर्कों पर ध्यान नहीं देता है, हालांकि यह है कि बाकी की तुलना में एक स्पष्ट बयान के कम है int main(void) निर्दिष्ट करने के लिए सबसे अच्छा है।
  • मैं स्पष्ट लाइसेंस C99 में दी गई नापसंद main() के अंत से वापसी छोड़ और यह अपने आप का उपयोग नहीं करते; मैं स्पष्ट होने के लिए return 0; लिखता हूं।

मुझे लगता है कि long long का उपयोग करते हुए लिखा गया है कि संपूर्ण एल्गोरिदम संदिग्ध है; डेटा प्रकार शायद और अधिक long double की तरह (scanf() प्रारूप के लिए %Lf, और शायद printf() प्रारूपों के लिए %19.16Lf साथ होना चाहिए।

0
double pi = 2 * acos(0.0); 
    int n; 
    scanf("%d",&n); //precision with which you want the value of pi 
    printf("%.*lf\n",n,pi); 
+1

जबकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण शामिल है वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं –