प्रिंटफ़ में डबल के लिए सही प्रारूप निर्दिष्ट करता है


480

doublePrintf में सही प्रारूप निर्दिष्ट करने वाला क्या है ? क्या यह%f या है %lf? मुझे विश्वास है कि यह है %f, लेकिन मुझे यकीन नहीं है।

कोड नमूना

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

19
यदि आप एक C89 पुस्तकालय के साथ फंस गए हैं, "%lf"अपरिभाषित है; C99 और C11 पुस्तकालयों में इसे उसी के रूप में परिभाषित किया गया है "%f"
पीएम

1
आपका वेरिएंट उतना ही सही है जितना कि यह कभी मिलता है। %lfके लिए सही प्रारूप निर्दिष्ट है double। लेकिन C99 में ऐसा हो गया। इससे पहले एक का उपयोग करना था %f
चींटी

जवाबों:


624

"%f"एक डबल के लिए (या कम से कम एक) सही प्रारूप है। एक के लिए कोई प्रारूप नहीं है float, क्योंकि यदि आप एक floatको पास करने का प्रयास करते हैं printf, तो इसे 1 प्राप्त करने doubleसे पहले प्रचारित किया जाएगा । वर्तमान मानक के तहत भी स्वीकार्य है - रूपांतरण विनिर्देशक (अन्य के बीच) के बाद कोई प्रभाव नहीं होने के कारण निर्दिष्ट किया जाता है ।printf"%lf"lf

ध्यान दें कि यह एक ऐसी जगह है जो printfप्रारूप के तार scanf(और fscanf, आदि) प्रारूप के तार से काफी भिन्न होते हैं। उत्पादन के लिए, आप एक गुजर रहे हैं मूल्य , जिसमें से बढ़ावा दिया जाएगा floatकरने के लिए doubleजब एक variadic पैरामीटर के रूप में पारित कर दिया। इनपुट के लिए आप एक पॉइंटर पास कर रहे हैं , जिसका प्रचार नहीं किया गया है, इसलिए आपको यह बताना होगा scanfकि क्या आप पढ़ना चाहते हैं floatया नहीं double, इसलिए scanf, %fइसका मतलब है कि आप पढ़ना चाहते हैं floatऔर %lfइसका मतलब है कि आप पढ़ना चाहते हैं double(और, इसके लिए क्या चाहते हैं मूल्य, एक के लिए long double, आप या %Lfतो के लिए उपयोग करें )।printfscanf


1. C99, C6.5.2.2 / 6: "यदि अभिव्यक्ति जो कि फ़ंक्शन को सूचित करती है उसमें एक प्रकार होता है जिसमें एक प्रोटोटाइप शामिल नहीं होता है, तो प्रत्येक तर्क पर पूर्णांक प्रचार किया जाता है, और प्रकार फ़्लोट वाले तर्क डबल में पदोन्नत होते हैं। इन्हें डिफ़ॉल्ट तर्क पदोन्नति कहा जाता है। " C ++ में शब्दांकन कुछ अलग है (उदाहरण के लिए, यह "प्रोटोटाइप" शब्द का उपयोग नहीं करता है) लेकिन प्रभाव समान है: फ़ंक्शन द्वारा प्राप्त होने से पहले सभी वैरिएड पैरामीटर डिफ़ॉल्ट पदोन्नति से गुजरते हैं।


8
ध्यान दें कि जब संकलन के साथ g++खारिज %lfकिया जाता है -Wall -Werror -pedantic:error: ISO C++ does not support the ‘%lf’ gnu_printf format
kynan

2
@kynan: यदि ऐसा है (l पर g + का वर्तमान संस्करण मानकर), तो यह g ++ में बग है। C89 / 90 और C ++ 98/03 के लिए, अनुमति देना lएक विस्तार था। C99 / 11 और C ++ 11 मानकों को इसे अनुमति देने के लिए कार्यान्वयन की आवश्यकता होती है।
जेरी कॉफिन

1
उत्सुकता से, scanf यहdouble प्रतिनिधित्व करना चाहता है %lf: यह शिकायत करता है कि यह अपेक्षित है float *और double *बस के साथ मिला है %f
एरिक डैंड

1
@ जेरेकॉफ़िन जी ++ अभी भी जी ++ 98 मोड में डिफॉल्ट करता है
एमएम

5
@EricDand ऐसा इसलिए scanfहै क्योंकि पॉइंटर्स को स्टोर करना है कि वह क्या पढ़ता है, इसलिए यह जानने की जरूरत है कि स्पेस कितना बड़ा बताया जा रहा है, जबकि printfवैल्यूज खुद लेती हैं, और "डिफाल्ट लॉजिक प्रमोशन" का मतलब दोनों ही अंत में doubles है, इसलिए lहै अनिवार्य रूप से वैकल्पिक।
ट्रिपहाउंड 13

63

C99 मानक (अर्थात्, N1256) को देखते हुए ड्राफ्ट) , नियम फ़ंक्शन प्रकार पर निर्भर करते हैं: fprintf (printf, sprintf, ...) या scanf।

यहां प्रासंगिक हिस्से निकाले गए हैं:

प्रस्तावना

यह दूसरा संस्करण रद्द करता है और पहले संस्करण, ISO / IEC 9899: 1990 को बदल देता है और ISO / IEC 9899 / COR1: 1994, ISO / IEC 9899 / AMD1: 1995, और ISO / IEC 9899 / COR2: 1996 द्वारा संशोधित और सही हो जाता है। पिछले संस्करण के प्रमुख परिवर्तनों में शामिल हैं:

  • %lf में रूपांतरण विनिर्देशक की अनुमति है printf

7.19.6.1 fprintfफ़ंक्शन

7 लंबाई संशोधक और उनके अर्थ हैं:

एल (ell) निर्दिष्ट करता है कि (...) का निम्नलिखित a, A, e, E, f, F, g, या G रूपांतरण विनिर्देशक पर कोई प्रभाव नहीं है।

एल निर्दिष्ट करता है कि निम्नलिखित ए, ए, ई, ई, एफ, एफ, जी, या जी रूपांतरण विनिर्देश एक लंबे दोहरे तर्क पर लागू होते हैं।

के लिए fprintfआवेदन के लिए निर्दिष्ट समान नियम printf,sprintf और इसी तरह के कार्यों के लिए।

7.19.6.2 fscanf समारोह

1 1 लंबाई संशोधक और उनके अर्थ हैं:

एल (ell) निर्दिष्ट करता है कि (...) कि a, a, e, E, f, F, g, या G रूपांतरण विनिर्देशक निम्न प्रकार के संकेतक के साथ एक तर्क पर लागू होता है;

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

12 रूपांतरण विनिर्देशक और उनके अर्थ हैं: a, e, f, g एक वैकल्पिक रूप से हस्ताक्षरित फ्लोटिंग-पॉइंट नंबर, (...) से मेल खाता है

14 रूपांतरण विनिर्देशक ए, ई, एफ, जी, और एक्स भी मान्य हैं और क्रमशः, ए, ई, एफ, जी, और एक्स के समान व्यवहार करते हैं।

fprintfनिम्नलिखित विनिर्देशक और संबंधित प्रकारों के लिए लंबी कहानी छोटी है :

  • %f -> डबल
  • %Lf -> लंबी डबल।

और इसके लिए fscanfहै:

  • %f -> तैरता है
  • %lf -> डबल
  • %Lf -> लंबी डबल।

25

यह हो सकता है %f, %gया %eआप कैसे संख्या को स्वरूपित करना चाहते हैं पर निर्भर करता है। अधिक जानकारी के लिए यहां देखें । lसंशोधक में आवश्यक है scanfके साथ doubleनहीं, बल्कि में printf


1
-1: l(लोअरकेस) संशोधक पूर्णांक प्रकारों के लिए है ( cplusplus.com/reference/clibrary/cstdio/printf ), और Lफ्लोटिंग पॉइंट प्रकारों के लिए है। इसके अतिरिक्त, Lसंशोधक को उम्मीद है long double, सादा नहीं double
user470379

10
user470379: तो मेरे जवाब में विरोधाभास कहां है? नहीं मैंने कहा कि lइसके printfलिए आवश्यक नहीं है double
विएतुत

15

प्रारूप %lfबिल्कुल सही printfप्रारूप है double, ठीक उसी तरह जैसे आपने इसका उपयोग किया था। आपके कोड में कुछ भी गलत नहीं है।

स्वरूप %lfमें printfसी भाषा है, जिसके लिए प्रारूप विनिर्देशक के बीच बनाया सतही "विसंगति" के पुराने (पूर्व C99) संस्करणों में समर्थित नहीं किया गया था doubleमें printfऔरscanf । वह सतही असंगति C99 में तय की गई है।

आप का उपयोग करने के लिए आवश्यक नहीं कर रहे हैं %lfसाथ doubleमें printf। आप उपयोग कर सकते हैं %f, यदि आप पसंद करते हैं ( %lfऔर %fबराबर हैं printf)। लेकिन आधुनिक सी में इसका इस्तेमाल करने के लिए पसंद करने के लिए उपयुक्त समझ में आता है %fके साथ float, %lfके साथ doubleऔर %Lfसाथ long doubleलगातार दोनों में printfऔर scanf


साथ scanf(), "%f", "%lf"एक से मेल खाते हैं float *, double *, नहीं float, doubleके रूप में अंतिम पंक्ति से गर्भित।
chux -

9

%Lf(नोट कैपिटल L) लंबे डबल्स के लिए प्रारूप निर्दिष्ट करने वाला है

सादा के लिए doubles, या तो %e, %E, %f, %gया %Gक्या करेंगे।


बीच क्या अंतर है %gऔर %G?
यानपस

@yanpas, लोअरकेस / अपरकेस, प्रतिपादक प्रतीक के लिए, क्रमशः।
फ्रैडरिक हमीदी

क्षमा करें,% g और% G आउटपुट E प्रतीक करते हैं। इसके अलावा वे अलग-अलग मामलों में INF और inf का उत्पादन करते हैं
यान्पस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.