ऐसा लगता है कि आप (हाथ से) एक राज्य मशीन के लिए कितनी मात्रा में निर्माण करना चाहते हैं जहां प्रत्येक राज्य एनएच इनपुट अंक या एक्सपोनेंट अंक को संभालता है; इस राज्य मशीन को पेड़ की तरह आकार दिया जाएगा (कोई लूप नहीं!)। लक्ष्य जहां भी संभव हो पूर्णांक अंकगणित करना है, और (स्पष्ट रूप से) राज्यों में असाइनमेंट, स्टोर्स और बाद में ऐसे मूल्यों के परीक्षण/परीक्षण से बचने के लिए राज्य चरों ("अग्रणी शून्य", "स्थिति 3 पर दशमलव बिंदु") को याद रखने के लिए है। । केवल इनपुट वर्णों पर सादे पुराने "अगर" कथन के साथ राज्य मशीन को कार्यान्वित करें (इसलिए आपका पेड़ घोंसला वाले आईएसएस का सेट हो जाता है)। इनलाइन बफर वर्णों तक पहुंचता है; आप धीमा करने के लिए getchar
पर फ़ंक्शन कॉल नहीं करना चाहते हैं।
अग्रणी शून्य बस दबाया जा सकता है; हास्यास्पद रूप से लंबे समय तक शून्य अनुक्रमों को संभालने के लिए आपको यहां एक लूप की आवश्यकता हो सकती है। पहले nonzero अंक को संचयक शून्य या दस से गुणा किए बिना एकत्र किया जा सकता है। पहले 4-9 nonzero अंक (16 बिट या 32 बिट्स पूर्णांक के लिए) पूर्णांक दस के साथ पूर्णांक गुणा के साथ एकत्र किया जा सकता है (अधिकांश कंपलरों द्वारा कुछ बदलावों और जोड़ों में परिवर्तित)। [शीर्ष पर: शून्य अंकों को किसी भी काम की आवश्यकता नहीं होती है जब तक कि एक गैर-शून्य अंक नहीं मिलता है और फिर एन अनुक्रमिक शून्य के लिए 10^एन गुणा आवश्यक है; आप इसे सब राज्य मशीन में तार कर सकते हैं]। आपकी मशीन के शब्द आकार के आधार पर पहले 4-9 के बाद अंक 32 या 64 बिट गुणों का उपयोग करके एकत्र किए जा सकते हैं। चूंकि आपको सटीकता की परवाह नहीं है, इसलिए आप 32 या 64 बिट्स के लायक होने के बाद अंकों को अनदेखा कर सकते हैं; मुझे लगता है कि जब आप इन नंबरों के साथ वास्तव में अपने आवेदन के साथ वास्तव में क्या करते हैं, तो आप वास्तव में कुछ निश्चित संख्या में nonzero अंक प्राप्त कर सकते हैं जब आप वास्तव में रोक सकते हैं। अंक स्ट्रिंग में पाया गया दशमलव बिंदु बस राज्य मशीन पेड़ में एक शाखा का कारण बनता है। वह शाखा बिंदु के निहित स्थान को जानता है और इसलिए बाद में दस की शक्ति द्वारा उचित तरीके से कैसे स्केल किया जाए। प्रयास के साथ, यदि आप इस कोड के आकार को पसंद नहीं करते हैं तो आप कुछ राज्य मशीन उप-पेड़ों को गठबंधन करने में सक्षम हो सकते हैं।
[शीर्ष पर: पूर्णांक और fractional भागों को अलग (छोटे) पूर्णांक के रूप में रखें। इसके लिए पूर्णांक और अंश भागों को गठबंधन करने के लिए अंत में अतिरिक्त फ़्लोटिंग पॉइंट ऑपरेशन की आवश्यकता होगी, शायद इसके लायक नहीं है]।
[शीर्ष पर: अंक जोड़े के लिए 2 वर्णों को 16 बिट मान में एकत्र करें, 16 बिट मान देखें। यह मेमोरी एक्सेस के लिए व्यापार में रजिस्टरों में गुणा करने से बचाता है, शायद आधुनिक मशीनों पर जीत नहीं]।
"ई" का सामना करने पर, एक्सपोनेंट को उपरोक्त के रूप में एक पूर्णांक के रूप में एकत्र करें; प्रीकंप्यूटेड गुणक की तालिका में दस की सटीक प्रीकंप्यूटेड/स्केल की गई शक्तियों को देखें (पारस्परिक रूप से पारस्परिक रूप से "-" संकेत मौजूद है) और संग्रहित मंटिसा को गुणा करें। (कभी एक फ्लोट विभाजित मत करो)। चूंकि प्रत्येक एक्सपोनेंट संग्रह दिनचर्या पेड़ की एक अलग शाखा (पत्ता) में होती है, इसलिए इसे दस सूचकांक की शक्ति को ऑफसेट करके दशमलव बिंदु के स्पष्ट या वास्तविक स्थान के लिए समायोजित करना होता है।
[शीर्ष पर: आप ptr++
की लागत से बच सकते हैं यदि आप जानते हैं कि संख्या के लिए वर्ण एक बफर में रैखिक रूप से संग्रहीत हैं और बफर सीमा पार नहीं करते हैं। एक वृक्ष शाखा के साथ केटी राज्य में, आप केटी चरित्र को *(start+k)
के रूप में एक्सेस कर सकते हैं। एक अच्छा कंपाइलर आमतौर पर एड्रेसिंग मोड में अनुक्रमित ऑफसेट में "... + के" को छुपा सकता है।]
सही हो गया, यह योजना लगभग एक सस्ता गुणा-प्रति गैर-शून्य अंकों को जोड़ती है, एक कास्ट-टू-फ्लोट मंटिसा का, और एक फ़्लोटिंग गुणा करके दशमलव बिंदु के एक्सपोनेंट और स्थान के परिणाम को स्केल करने के लिए गुणा करता है।
मैंने उपर्युक्त लागू नहीं किया है। मैंने लूप के साथ इसके संस्करणों को लागू किया है, वे बहुत तेज़ हैं।
'isdigit' पर लोकेल परिवर्तनों की जांच करता है? शायद उन्हें आईएसओ सी मानक में देखना चाहिए। 'isdigit' में कोई लोकेल-निर्भर व्यवहार नहीं है; यह जांचना चाहिए कि क्या चरित्र '0' के माध्यम से' 9' के तत्व का तत्व है, और यही वह है। – Kaz
क्या आप हमें समस्या डोमेन का एक विचार दे सकते हैं? मुझे लगता है कि यह वित्तीय नहीं है, या आप निश्चित बिंदु अंकगणित का उपयोग करेंगे। क्या यह एक नियंत्रण प्रणाली के लिए है, जैसे पोजीशनिंग? क्या आपके पास वास्तविक समय की आवश्यकताएं हैं (हार्ड या मुलायम)? –
यदि आप संदेश प्रारूप को संशोधित कर सकते हैं, स्पष्ट रूप से बाइनरी फ्लोट (या बाइनरी का एक सरल पाठ एन्कोडिंग) भेजना दूसरी तरफ महंगे पार्सिंग को बचाएगा। जैसे बाइनरी ठीक नहीं है, लेकिन यह है कि एक हेक्स पूर्णांक के रूप में फ्लोट डंप करें। –