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




double format-specifiers (5)

%Lf (पूंजी L नोट करें) लंबे युगल के लिए cplusplus.com/reference/clibrary/cstdio/printf

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

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

कोड नमूना

#include <stdio.h>

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

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

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

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


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


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

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

प्रस्तावना

यह दूसरा संस्करण आईएसओ / आईईसी 98 99 / सीओआर 1: 1 99 4, आईएसओ / आईईसी 98 99 / एएमडी 1: 1 99 5, और आईएसओ / आईईसी 98 99 / सीओआर 2: 1 99 6 में संशोधित और सही के रूप में पहले संस्करण, आईएसओ / आईईसी 98 99: 1 99 0 को रद्द और प्रतिस्थापित करता है। पिछले संस्करण के प्रमुख परिवर्तनों में शामिल हैं:

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

7.19.6.1 fprintf समारोह

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

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

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

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

7.19.6.2 fscanf फ़ंक्शन

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

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

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

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

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

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

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

और fscanf यह है:

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

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

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

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





format-specifiers