मैं @Jens Gustedt हेक्साडेसिमल समाधान सुझाता हूं:% a का उपयोग करें।
ओपी चाहता है कि "अधिकतम सटीकता के साथ प्रिंट करें (या कम से कम सबसे महत्वपूर्ण दशमलव)"।
एक सरल उदाहरण के रूप में एक सातवें प्रिंट होगा:
#include <float.h>
int Digs = DECIMAL_DIG;
double OneSeventh = 1.0/7.0;
printf("%.*e\n", Digs, OneSeventh);
// 1.428571428571428492127e-01
लेकिन चलो गहरी खुदाई करें ...
गणितीय रूप से, उत्तर "0.142857 142857 142857 ..." है, लेकिन हम परिमित सटीक फ़्लोटिंग पॉइंट संख्याओं का उपयोग कर रहे हैं। आइए मान लें कि IEEE 754 डबल-सटीक बाइनरी । तो OneSeventh = 1.0/7.0
नीचे दिए गए मूल्य में परिणाम। यह भी दर्शाया गया है कि पूर्ववर्ती और निम्नलिखित प्रतिनिधित्व योग्य double
फ्लोटिंग संख्याएँ हैं।
OneSeventh before = 0.1428571428571428 214571170656199683435261249542236328125
OneSeventh = 0.1428571428571428 49212692681248881854116916656494140625
OneSeventh after = 0.1428571428571428 769682682968777953647077083587646484375
किसी सीमित उपयोग के सटीक दशमलव प्रतिनिधित्व को मुद्रित करना double
।
सी में मैक्रों के 2 परिवार हैं <float.h>
जो हमारी मदद करेंगे।
पहला सेट दशमलव में एक स्ट्रिंग में प्रिंट करने के लिए महत्वपूर्ण अंकों की संख्या है इसलिए स्ट्रिंग को वापस स्कैन करते समय, हमें मूल फ़्लोटिंग पॉइंट मिलता है। सी कल्पना के न्यूनतम मूल्य और एक नमूना C11 संकलक के साथ दिखाए जाते हैं ।
FLT_DECIMAL_DIG 6, 9 (float) (C11)
DBL_DECIMAL_DIG 10, 17 (double) (C11)
LDBL_DECIMAL_DIG 10, 21 (long double) (C11)
DECIMAL_DIG 10, 21 (widest supported floating type) (C99)
दूसरा सेट एक महत्वपूर्ण अंक की संख्या है जिसे एक स्ट्रिंग को एक फ़्लोटिंग पॉइंट में स्कैन किया जा सकता है और फिर एफपी मुद्रित किया जाता है, फिर भी उसी स्ट्रिंग प्रस्तुति को बनाए रखता है। सी कल्पना के न्यूनतम मूल्य और एक नमूना C11 संकलक के साथ दिखाए जाते हैं । मेरा मानना है कि उपलब्ध पूर्व C99।
FLT_DIG 6, 6 (float)
DBL_DIG 10, 15 (double)
LDBL_DIG 10, 18 (long double)
मैक्रों का पहला सेट ओपी के महत्वपूर्ण अंकों के लक्ष्य को पूरा करता है । लेकिन वह स्थूल हमेशा उपलब्ध नहीं होता है।
#ifdef DBL_DECIMAL_DIG
#define OP_DBL_Digs (DBL_DECIMAL_DIG)
#else
#ifdef DECIMAL_DIG
#define OP_DBL_Digs (DECIMAL_DIG)
#else
#define OP_DBL_Digs (DBL_DIG + 3)
#endif
#endif
"+ 3" मेरे पिछले उत्तर की क्रूरता थी। इसका केंद्र इस बात पर केंद्रित है कि राउंड-ट्रिप रूपांतरण स्ट्रिंग-एफपी-स्ट्रिंग (सेट # 2 मैक्रो उपलब्ध C89) को जानने के बाद, कोई व्यक्ति एफपी-स्ट्रिंग-एफपी (सेट # 1 मैक्रोज़ उपलब्ध पोस्ट C89) के लिए अंक कैसे निर्धारित करेगा? सामान्य तौर पर, 3 जोड़ें परिणाम था।
अब प्रिंट करने के लिए कितने महत्वपूर्ण अंक ज्ञात और संचालित हैं <float.h>
।
एन महत्वपूर्ण दशमलव अंकों को मुद्रित करने के लिए विभिन्न स्वरूपों का उपयोग किया जा सकता है।
साथ "%e"
, सटीक क्षेत्र लीड अंक और दशमलव बिंदु के बाद अंकों की संख्या है । तो - 1
क्रम में है। नोट: यह -1
प्रारंभिक में नहीं हैint Digs = DECIMAL_DIG;
printf("%.*e\n", OP_DBL_Digs - 1, OneSeventh);
// 1.4285714285714285e-01
साथ "%f"
, परिशुद्धता क्षेत्र अंकों की संख्या है के बाद दशमलव बिंदु। जैसे संख्या के लिए OneSeventh/1000000.0
, किसी को OP_DBL_Digs + 6
सभी महत्वपूर्ण अंक देखने होंगे।
printf("%.*f\n", OP_DBL_Digs , OneSeventh);
// 0.14285714285714285
printf("%.*f\n", OP_DBL_Digs + 6, OneSeventh/1000000.0);
// 0.00000014285714285714285
नोट: कई करने के लिए उपयोग कर रहे हैं "%f"
। जो दशमलव बिंदु के बाद 6 अंक प्रदर्शित करता है; 6 डिस्प्ले डिफॉल्ट है, संख्या की शुद्धता नहीं।