इस प्रश्न के प्रयोजनों के लिए, मैं में printf
सुविधाओं का उपयोग करने की क्षमता रखने की क्षमता है (मैं आपको बता नहीं सकता कि दुर्भाग्यवश क्यों है, लेकिन आइए अब यह मान लें कि मैं जानता हूं कि मैं क्या कर रहा हूं)।आप आईईईई 754 नंबर (printf के बिना) कैसे प्रिंट करते हैं?
एक IEEE754 एकल परिशुद्धता संख्या के लिए, आप निम्नलिखित बिट्स है:
SEEE EEEE EFFF FFFF FFFF FFFF FFFF FFFF
जहां S
संकेत है, E
प्रतिपादक और F
अंश है।
संकेत मुद्रण, के रूप में, NaN
(E == 0xff, F != 0
), Inf
(E == 0xff, F == 0
) और 0
(E == 0, F == 0
की तरह सभी विशेष मामलों बढ़ रहा है विशेष माना जाता है सिर्फ इसलिए प्रतिपादक पूर्वाग्रह उस मामले में नहीं किया जाता है सभी मामलों के लिए अपेक्षाकृत आसान है)।
मेरे दो प्रश्न हैं।
पहला यह है कि सामान्यीकृत संख्याओं (जहां 1 <= E <= 0xfe
) में denormalised संख्या (जहां E == 0, F != 0
) को चालू करना सबसे अच्छा है? मुझे संदेह है कि अगले प्रश्न के उत्तर को सरल बनाना आवश्यक होगा (लेकिन मैं गलत हो सकता हूं इसलिए मुझे शिक्षित करने के लिए स्वतंत्र महसूस करें)।
दूसरा प्रश्न सामान्यीकृत संख्याओं को मुद्रित करना है। मैं उन्हें दो तरीकों से प्रिंट करने में सक्षम होना चाहता हूं, -3.74195E3
जैसे घातीय और 3741.95
जैसे गैर-घातीय। हालांकि, बस उन दोनों तरफ से देखकर, यह दशमलव को चारों ओर दशमलव बिंदु को स्थानांतरित करके पूर्व में बदलना काफी आसान होना चाहिए। तो चलिए घातीय रूप पर ध्यान केंद्रित करते हैं।
मैं जब दोनों सीमा सहमति एक एल्गोरिथ्म मैं बहुत पहले पीआई जहां आप कभी भी कम करने सूत्रों में से एक का इस्तेमाल किया और संभावनाओं पर एक ऊपरी और निचली सीमा रखा प्रिंट, एक अंकों outputting के लिए प्रयोग किया जाता है के एक अस्पष्ट याद है , और 10 के कारक द्वारा गणना को स्थानांतरित करना (इसलिए जब ऊपरी और निचली सीमा
3.2364
और3.1234
थी, तो आप3
आउटपुट कर सकते हैं और गणना के लिए समायोजित कर सकते हैं)।लेकिन यह लंबा समय रहा है क्योंकि मैंने ऐसा किया है, इसलिए मुझे यह भी पता नहीं है कि यह यहां लेने के लिए उपयुक्त दृष्टिकोण है या नहीं। ऐसा लगता है क्योंकि प्रत्येक बिट का मान आंशिक भाग (
1/2
,1/4
,1/8
और इसी तरह से आगे बढ़ते समय पिछली बिट का आधा है)।
मैं वास्तव में नहीं पसंद करते हैं printf
स्रोत कोड के माध्यम से trudging जाना है जब तक बिल्कुल जरूरी तो है, अगर किसी को भी इस के साथ मदद कर सकते हैं, मैं सदा आभारी हो जाएगा होगा।
क्या आपको तेज़ या किसी की इच्छा है? – ruslik
यह एक अंधेरा कोने है, जिसमें subtleties हर मोड़ पर काटने का इंतजार कर रहे हैं। आपको सी रनटाइम लाइब्रेरी से कोड उठाने के लिए बेहतर तरीके से सेवा दी जा सकती है जो आपके इच्छित उपयोग की अनुमति देता है। बेशक, दूसरी दिशा को सही करने के लिए सही नहीं है ... – RBerteig
यहां [eglibc कार्यान्वयन] है (http://www.eglibc.org/cgi-bin/viewcvs.cgi/branches/eglibc-2_12 /libc/stdio-common/printf_fp.c?rev=10495&view=markup)। ऐसा लगता है कि अच्छी तरह से टिप्पणी की गई है, लेकिन फिर भी पढ़ने के लिए कोई मजेदार नहीं है। –