दिलचस्प पोस्ट
क्या ऐरे और ऑब्जेक्ट में स्पेस का हिस्सा है? स्कैनर विधि को चार अक्षर प्राप्त करने के लिए मैं एक वेब पेज में एक RTSP वीडियो स्ट्रीम कैसे दिखा सकता हूं? मैं मेकफाइल लक्ष्य में बास सिंटैक्स का उपयोग कैसे कर सकता हूं? bash: अवैध संख्या XML-RPC और SOAP में क्या अंतर है? HTML5: "रेडियो" इनपुट फ़ील्ड के साथ "अपेक्षित" विशेषता का उपयोग कैसे करें अधिकतम राशि उपन्यासकार? लिबोजपेग संकलित करना zf2 में एकाधिक डेटाबेस कॉन्फ़िगर करें C # DllImport C ++ बूलियन फ़ंक्शन के साथ ठीक से नहीं लौट रहा है पृष्ठ लोड के बीच चर को जारी रखें पायथन के लिए क्लास विधियों क्या हैं? WebBrowser नियंत्रण में JavaScript त्रुटि अक्षम करें क्या मैं अपने ब्राउज़र में ऑब्जेक्ट्स के आकार की सीमाओं तक पहुंच सकता हूं, जो संभाल सकता है?

Printf में डबल के लिए सही प्रारूप विनिर्देशक

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

कोड नमूना

 #include <stdio.h> int main() { double d = 1.4; printf("%lf", d); // Is this wrong? } 

वेब के समाधान से एकत्रित समाधान "Printf में डबल के लिए सही प्रारूप विनिर्देशक"

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

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


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

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

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

प्रस्तावना

आईएसओ / आईईसी 9899 / सीओआर 1: 1994, आईएसओ / आईईसी 9899 / एएमडी 1: 1 99 5 और आईएसओ / आईईसी 9899 / सीओआर 2: 1 99 6 द्वारा संशोधित और सुधार के रूप में इस दूसरे संस्करण को रद्द कर दिया गया है और पहले संस्करण, आईएसओ / आईईसी 9899: 1990 को बदल दिया गया है। पिछले संस्करण में प्रमुख बदलाव शामिल हैं:

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

7.1 9.6.1 एफप्रिंटफ फंक्शन

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

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

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

printf , sprintf और समान फ़ंक्शंस के लिए fprintf लिए निर्दिष्ट एक ही नियम लागू होता है।

7.1 9.6.2 एफएससीएनएफ फ़ंक्शन

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

एल (ell) निर्दिष्ट करता है कि (…) कि निम्नलिखित ए, ए, ई, ई, एफ, एफ, जी, या जी कनवर्ज़न विनिर्देशक टाइप पॉइंटर के साथ एक तर्क को दोगुना करने के लिए लागू होता है;

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

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

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

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

  • %f -> डबल
  • %Lf -> लंबे डबल

और fscanf यह है:

  • %f -> फ्लोट
  • %lf -> डबल
  • %Lf -> लंबे डबल

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

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

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

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

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

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

डबल के लिए आप बस %lf उपयोग कर सकते हैं या आप अपनी पसंद के अनुसार निम्नलिखित में से किसी का उपयोग कर सकते हैं

घाटे का प्रारूप में मूल्यों के लिए %e या %E

%g या %G लिए सामान्य या घातीय नोटेशन, जो इसके परिमाण के लिए अधिक उपयुक्त है

यहां अधिक पढ़ें सी में सभी प्रारूप विवरण की सूची