हाँ, आप चल बिन्दु आपरेशनों रूप में लंबे समय के रूप में इन आपरेशनों सटीक हैं में निर्माण विघटित कर सकते हैं, और आप एक एकल अंतिम अयथार्थ आपरेशन खर्च कर सकते हैं।
दुर्भाग्य से, चल बिन्दु आपरेशनों जल्द ही अयथार्थ हो जाते हैं, जब आप अपूर्णांश की शुद्धता से अधिक है, परिणाम गोल कर रहे हैं। एक बार गोल करने के बाद "त्रुटि" पेश की जाती है, इसे आगे के संचालन में संचयी किया जाएगा ...
तो, आमतौर पर, नहीं, आप मनमानी दशमलव को बदलने के लिए ऐसे बेवकूफ एल्गोरिदम का उपयोग नहीं कर सकते हैं, इससे गलत तरीके से गोल संख्या हो सकती है , सही के कई उलझन से दूर, जैसे कि दूसरों ने आपको पहले ही बताया है।
लेकिन चलो देखते हैं कि हम कितनी दूर जा सकते हैं:
आप ध्यान से इस तरह नाव को फिर से संगठित हैं:
if(biasedExponent >= 0)
return integerMantissa * (10^biasedExponent);
else
return integerMantissa/(10^(-biasedExponent));
वहाँ परिशुद्धता पार करने के लिए एक खतरा है दोनों जब integerMantissa cumulating अगर यह है कई अंक, और biasedExponent की शक्ति के लिए 10 उठाते समय ...
सौभाग्य से, यदि पहले दो ऑपरेशन सटीक हैं, तो आप आईईईई संपत्तियों के लिए अंतिम अचूक ऑपरेशन * या/ies, परिणाम सही ढंग से गोल किया जाएगा।
चलो इसे एकल परिशुद्धता फ्लोट पर लागू करें जिसमें 24 बिट्स की सटीकता है।
10^8 > 2^24 > 10^7
यह देखते हुए कि 2 के कई केवल प्रतिपादक बढ़ाने के लिए और अपूर्णांश अपरिवर्तित छोड़ देंगे, हम केवल 10 का घातांक के लिए 5 की शक्तियों से निपटने के लिए:
5^11 > 2^24 > 5^10
हालांकि, आप 7 खर्च कर सकते हैं integerMantissa में सटीकता और -10 और 10
डबल परिशुद्धता, 53 बिट्स में जो biasedExponent की अंक,
10^16 > 2^53 > 10^15
5^23 > 2^53 > 5^22
,210
तो तुम 15 दशमलव अंक खर्च कर सकते हैं, और -22 और 22
यह देखने के लिए कि आपके नंबर हमेशा सही रेंज में गिर जाएगी आप पर निर्भर है ... (क्या तुम सच में मुश्किल कर रहे हैं के बीच एक पक्षपाती प्रतिपादक , आप पिछली ज़ीरो डालने/निकालने से मंटिसा और एक्सपोनेंट को संतुलित करने की व्यवस्था कर सकते हैं)।
अन्यथा, आपको कुछ विस्तारित परिशुद्धता का उपयोग करना होगा।
अपनी भाषा मनमाना परिशुद्धता पूर्णांकों प्रदान करता है, तो यह थोड़ा मुश्किल यह सही पाने के लिए है, लेकिन ऐसा नहीं है कि मुश्किल है, मैं स्मालटाक में ऐसा किया और http://smallissimo.blogspot.fr/2011/09/clarifying-and-optimizing.html में यह के बारे में ब्लॉग और http://smallissimo.blogspot.fr/2011/09/reviewing-fraction-asfloat.html
ध्यान दें कि इन सरल और अनुभवहीन कार्यान्वयन हैं । सौभाग्य से, libc अधिक अनुकूलित है।
@Nils: आप राउंडिंग मोड को अनदेखा कर रहे हैं, et al। आवश्यक चीज़ों के लिए एक महसूस करने के लिए स्ट्रेट पर एक नज़र डालें। – user7116
हाँ, मुझे पता है। Denormals और शून्य को संभालने की तरह मैं और भी छोड़ दिया है। लेकिन मुझे यह लग रहा था कि मूल पोस्टर इसे सीखने के उद्देश्यों के लिए करना चाहता था, उत्पादन के लिए नहीं। –
आंशिक रूप से सच है। मैं एक स्ट्रिंग से एक फ्लोट पढ़ना चाहता हूं, लेकिन स्ट्रिंग के अंदर इसके बाद अन्य सामान भी हैं। जावा इसे संभाल नहीं सकता है। लेकिन चूंकि समस्या इतनी धीमी गति से सामने आती है, मैं बस फ्लोट को पार्स कर दूंगा, इसे स्ट्रिंग में रखूंगा और इसे Float.parseFloat() पर फेंक दूंगा;) – Thomas