सवाल printf और लंबे डबल


मैं विंडोज़ पर नेटबींस के साथ नवीनतम जीसीसी का उपयोग कर रहा हूं। क्यों नहीं long double काम? है printf विनिर्देशक %lf गलत?

कोड:

#include <stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 5.32e-5;
    long double dip = 5.32e-5;

    printf("%f can be written %e\n", aboat, aboat);
    printf("%f can be written %e\n", abet, abet);
    printf("%lf can be written %le\n", dip, dip);

    return 0;
}

आउटपुट:

32000.000000 can be written 3.200000e+004
0.000053 can be written 5.320000e-005
-1950228512509697500000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000.000000
can be written 2.725000e+002
Press [Enter] to close the terminal ...

44
2017-11-03 16:20


मूल


bytes.com/topic/c/answers/... - gameboy
जाहिर है MingW और लंबी डबल के साथ एक समस्या है - gameboy
के संभावित डुप्लिकेट सी में सही ढंग से एक लंबे डबल मुद्रित नहीं कर सकते हैं - phuclv


जवाब:


गलत संशोधक के अलावा, विंडोज़ के लिए जीसीसी का कौन सा बंदरगाह? mingw माइक्रोसॉफ्ट सी लाइब्रेरी का उपयोग करता है और मुझे याद है कि इस लाइब्रेरी के पास 80 बिट लंबे समय तक डबल का समर्थन नहीं है (माइक्रोसॉफ्ट सी कंपाइलर 64 बिट्स का उपयोग विभिन्न कारणों से लंबे समय तक करता है)।


11
2017-11-03 16:35



हाँ आप सही है - gameboy
bytes.com/topic/c/answers/... - gameboy


Printf manpage से:

एल (ell) एक निम्नलिखित पूर्णांक   रूपांतरण एक लंबे int के अनुरूप है   या हस्ताक्षर किए गए लंबे int तर्क, या ए   निम्नलिखित एन रूपांतरण से मेल खाता है   एक लंबे int तर्क के लिए एक सूचक, या ए   निम्नलिखित सी                 रूपांतरण wint_t तर्क, या निम्न एस के अनुरूप है   रूपांतरण एक सूचक से मेल खाता है   wchar_t तर्क।

तथा

एल ए निम्नलिखित ए, ए, ई, ई, एफ, एफ,   जी, या जी रूपांतरण एक के अनुरूप है   लंबे डबल तर्क। (सी 99 अनुमति देता है   % एलएफ, लेकिन एसयूएसवी 2 नहीं है।)

इसलिए आप यह चाहते हैं %Le , नहीं %le

संपादित करें: कुछ और जांच से यह संकेत मिलता है कि मिंगव एमएसवीसी / विन 32 रनटाइम (प्रिंटफ जैसे सामानों के लिए) का उपयोग करता है - जो लंबे समय तक डबल से दोगुना होता है। तो एक कंपाइलर (जीसीसी की तरह) को मिलाकर जो एक रनटाइम के साथ एक देशी लंबे डबल प्रदान करता है जो ऐसा नहीं लगता .. गड़बड़ हो।


39
2017-11-03 16:25



मुझे मिला linux.die.net/man/3/printf, लेकिन% एलएफ या% ले भी काम नहीं कर रहा है - gameboy
आप विंडोज पर नेटबींस के साथ किस कंपाइलर का उपयोग कर रहे हैं? - nos
नवीनतम जीसीसी और मिनजीडब्ल्यू - gameboy


इसके लिए हां long double, आपको उपयोग करने की ज़रूरत है %Lf (यानी, ऊपरी मामले 'एल')।


33
2017-11-03 16:23





यदि आप MinGW का उपयोग कर रहे हैं, तो समस्या यह है कि डिफ़ॉल्ट रूप से, MinGW I / O resps का उपयोग करता है। माइक्रोसॉफ्ट सी रनटाइम से फॉर्मेटिंग फ़ंक्शंस, जो 80 बिट फ़्लोटिंग पॉइंट नंबरों का समर्थन नहीं करता है (long double == double माइक्रोसॉफ्ट भूमि में)।

हालांकि, मिनजीडब्ल्यू वैकल्पिक कार्यान्वयन के एक सेट के साथ आता है कर लंबे समय तक लंबे युगल का समर्थन करें। उनका उपयोग करने के लिए, फ़ंक्शन नामों को उपसर्ग करें __mingw_ (उदाहरण के लिए __mingw_printf)। अपनी परियोजना की प्रकृति के आधार पर, आप वैश्विक स्तर पर भी चाह सकते हैं #define printf __mingw_printf या उपयोग करें -D__USE_MINGW_ANSI_STDIO (जो सभी के MinGW संस्करणों को सक्षम बनाता है printf-फैमिली फ़ंक्शन)।


20
2018-02-20 19:16





इस मुद्दे को लंबे समय तक युगल परीक्षण कर रहा था, और हां, मैं एक फिक्स में आया! आपको अपनी परियोजना को -D__USE_MINGW_ANSI_STDIO के साथ संकलित करना होगा:

जेसन हंटले @ सेंचुरियन / होम / डेवलपर / निर्भरता / पायथन -2.7.3/टेस्ट   $ gcc main.c

जेसन हंटले @ सेंचुरियन / होम / डेवलपर / निर्भरता / पायथन -2.7.3/टेस्ट   $ a.exe सी = 0.000000

जेसन हंटले @ सेंचुरियन / होम / डेवलपर / निर्भरता / पायथन -2.7.3/टेस्ट   $ gcc main.c -D__USE_MINGW_ANSI_STDIO

जेसन हंटले @ सेंचुरियन / होम / डेवलपर / निर्भरता / पायथन -2.7.3/टेस्ट   $ a.exe सी = 42.000000

कोड:

Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>

int main(int argc, char **argv)
{
   long double c=42;

   c/3;

   printf("c=%Lf\n",c);

   return 0;
}

6
2018-03-15 20:19





सी 99 में लंबाई संशोधक के लिए long double एसा लगता है L और नहीं lman fprintf (या खिड़कियों के बराबर) आपको अपने विशेष मंच के लिए बताना चाहिए।


4
2017-11-03 16:23



वह बहुत बुरा है वह विंडोज पर है, और उसके पास शायद एक मैनपेज नहीं है। वैसे भी, "मैन प्रिंटफ" या "प्रिंटफ मैनुअल पेज" या उसके जैसे कुछ के लिए Google। - Denilson Sá Maia


जैसा कि अन्य उत्तरों में कहा गया है, सही रूपांतरण विनिर्देशक है "%Lf"

आप उपयोग करके प्रारूप चेतावनी चालू करना चाह सकते हैं -Wformat (या -Wall, जो भी शामिल -Wformat) जीसीसी आमंत्रण में

$ gcc source.c
$ gcc -Wall source.c
स्रोत.c: समारोह में 'मुख्य':
स्रोत.c: 5: चेतावनी: प्रारूप "% lf" प्रकार 'डबल` प्रकार की अपेक्षा करता है, लेकिन तर्क 2 में' long double` टाइप किया गया है
स्रोत.c: 5: चेतावनी: प्रारूप "% le" प्रकार 'डबल' प्रकार की अपेक्षा करता है, लेकिन तर्क 3 में 'long double` टाइप किया गया है
$

2
2017-11-03 16:34





जावा में सही प्रिंटफ बातचीत : -

  double pi = Math.PI;

  System.out.format("%f%n", pi);       // -->  "3.141593"
  System.out.format("%.3f%n", pi);     // -->  "3.142"
  System.out.format("%10.3f%n", pi);   // -->  "     3.142"
  System.out.format("%-10.3f%n", pi);  // -->  "3.142"
  System.out.format(Locale.FRANCE,
                    "%-10.4f%n%n", pi); // -->  "3,1416"

  Calendar c = Calendar.getInstance();
  System.out.format("%tB %te, %tY%n", c, c, c); // -->  "May 29, 2006"

  System.out.format("%tl:%tM %tp%n", c, c, c);  // -->  "2:34 am"

  System.out.format("%tD%n", c);    // -->  "05/29/06"

-3
2018-05-05 15:04