Lua पूर्णांक और फ्लोट संख्या दोनों को कैसे संभालता है?


11

जहाँ तक मुझे अपने आप को याद है प्रोग्रामिंग मुझे सिखाया गया था कि समानता के लिए फ्लोटिंग पॉइंट नंबरों की तुलना न करें। अब, Lua प्रकार के बारे में Lua में प्रोग्रामिंग पढ़ते हुए number, मैंने निम्नलिखित पाया:

संख्या प्रकार वास्तविक (डबल-सटीक फ़्लोटिंग-पॉइंट) संख्याओं का प्रतिनिधित्व करता है। लुआ का कोई पूर्णांक प्रकार नहीं है, क्योंकि उसे इसकी आवश्यकता नहीं है। फ्लोटिंग-पॉइंट अंकगणितीय त्रुटियों के बारे में व्यापक भ्रांति है और कुछ लोगों को डर है कि फ्लोटिंग-पॉइंट नंबरों के साथ एक साधारण वेतन वृद्धि भी अजीब हो सकती है। तथ्य यह है कि, जब आप पूर्णांक का प्रतिनिधित्व करने के लिए दोहरे का उपयोग करते हैं, तो कोई भी गोल त्रुटि नहीं होती है (जब तक कि संख्या 100,000,000,000,000 से अधिक न हो)। विशेष रूप से, एक Lua संख्या गोल समस्याओं के बिना किसी भी लंबे पूर्णांक का प्रतिनिधित्व कर सकती है। इसके अलावा, अधिकांश आधुनिक सीपीयू फ्लोटिंग-पॉइंट अंकगणित को जितनी जल्दी (या उससे भी अधिक) पूर्णांक अंकगणित करते हैं।

क्या यह सभी भाषाओं के लिए सही है? मूल रूप से अगर हम डबल्स में फ्लोटिंग पॉइंट से आगे नहीं जाते हैं, तो हम पूर्णांक अंकगणित में सुरक्षित हैं? या, प्रश्न शीर्षक के अनुरूप होने के लिए, क्या कुछ विशेष है जो लुआ अपने numberप्रकार के साथ करता है इसलिए यह पूर्णांक और फ्लोट-पॉइंट दोनों प्रकार के रूप में ठीक काम कर रहा है?



@JoonasPulakka धन्यवाद, यह काफी मूल्यवान जोड़ है।
पेट्र अब्दुलिन

जवाबों:


11

Lua का दावा है कि फ्लोटिंग पॉइंट नंबर पूर्णांक संख्याओं का प्रतिनिधित्व कर सकते हैं जैसे कि पूर्णांक प्रकार, और मैं सहमत होने के लिए इच्छुक हूं। इससे निपटने के लिए भिन्नात्मक संख्यात्मक भाग का कोई अभेद्य प्रतिनिधित्व नहीं है। चाहे आप एक पूर्णांक प्रकार में एक पूर्णांक स्टोर करते हैं, या इसे एक फ्लोटिंग पॉइंट नंबर के मंटिसा में स्टोर करते हैं, परिणाम एक ही होता है: जब तक कि आप मंटिसा में बिट्स की संख्या से अधिक नहीं हो जाते, तब तक पूर्णांक का प्रतिनिधित्व किया जा सकता है। , घातांक में + 1 बिट।

बेशक, यदि आप एक फ्लोटिंग पॉइंट प्रतिनिधित्व में एक वास्तविक फ़्लोटिंग-पॉइंट नंबर (जैसे 12.345) को स्टोर करने का प्रयास करते हैं, तो सभी दांव बंद हो जाते हैं, इसलिए आपके प्रोग्राम को स्पष्ट करना होगा कि नंबर वास्तव में एक वास्तविक पूर्णांक है जो ओवरफ्लो नहीं करता है मंटिसा, इसे वास्तविक पूर्णांक की तरह व्यवहार करने के लिए (यानी समानता की तुलना के संबंध में)।

यदि आपको उससे अधिक पूर्णांक परिशुद्धता की आवश्यकता है, तो आप हमेशा एक मनमानी-सटीक पुस्तकालय नियोजित कर सकते हैं ।

आगे पढ़ना
लुआ में एक संख्या का अधिकतम मूल्य क्या है?


उनके दूसरे तर्क के बारे में क्या है, यानी कि फ्लोटिंग पॉइंट आधुनिक सीपीयू में पूर्णांक अंकगणित की तुलना में तेज या तेज है? पूर्णांक अंकगणितीय प्रदर्शन करने के लिए फ़्लोटिंग पॉइंट नंबरों का उपयोग करते हुए भी मेरे लिए संदिग्ध लगता है।
एंड्रेस एफ।

2
@AndresF। मैं यह नहीं देखता कि यह कैसे तेज है, जब तक कि आप दो के बजाय एक एकल संख्यात्मक प्रकार का उपयोग करके एक कास्ट को समाप्त नहीं कर रहे हैं।
रॉबर्ट हार्वे

माना। मेरे लिए कोई मतलब नहीं है। मुझे आश्चर्य है कि अगर इसे संदर्भ से बाहर ले जाया जाता है ...
एन्ड्रेस एफ।

1
पर्याप्त रूप से बड़े पूर्णांकों को फ्लोटिंग-पॉइंट ऑब्जेक्ट में संग्रहीत नहीं किया जा सकता है। 64-बिट doubleमें लगभग 51 या इतने मंटिसा बिट्स होते हैं; लगभग 2 ** 51 से बड़े विषम पूर्णांक में राउंडऑफ़ त्रुटियां होंगी। 64-बिट पूर्णांक बड़े पूर्णांक मानों को वास्तव में संग्रहीत कर सकता है, क्योंकि यह किसी भी बिट्स को प्रतिपादक के लिए समर्पित नहीं करता है।
कीथ थॉम्पसन

@KeithThompson: मुझे लगा कि मेरे जवाब में निहित था जब मैंने कहा कि "मंटिसा में संग्रहीत।" हालाँकि, मैं स्पष्ट करने के उत्तर को संपादित करूँगा।
रॉबर्ट हार्वे

6

डबल्स को मंटिसा और एक घातांक के रूप में संग्रहीत किया जाता है। अधिक जानकारी के लिए प्रारूप देखें । मूल रूप से, सभी संख्याएं फॉर्म की हैं: मंटिसा * 2 घातांक । 2 52 से छोटे किसी भी पूर्णांक के लिए , प्रतिपादक शून्य होगा, जिससे मंटिसा बिट-फॉर-बिट 52-बिट अहस्ताक्षरित पूर्णांक के बराबर हो जाएगा। नकारात्मक संख्याओं को इंगित करने के लिए एक अलग साइन बिट का उपयोग किया जाता है।

वास्तव में, यहां तक ​​कि 2 52 से बड़े कुछ पूर्णांकों का भी सटीक रूप से प्रतिनिधित्व किया जा सकता है, जब तक कि 52 एन डी के पिछले सभी अंक शून्य न हों। इसके अलावा, कुछ अंशों, जैसे 0.5, को वास्तव में दर्शाया जा सकता है। यह केवल तब होता है जब आधार 2 में अंश लगातार दोहरा रहा है (1/3 की तरह), या अन्यथा मूलांक से पिछले कई बिट्स की आवश्यकता होती है जो सटीक खो देते हैं।


यह लगातार दशमलव को दोहराने के कारण नहीं है। ऐसा इसलिए है क्योंकि कई दशमलव (आधार दस) संख्याओं को दो की शक्ति के रूप में बिल्कुल नहीं दिखाया जा सकता है।
रॉबर्ट हार्वे

3
आधार 2 में, संख्या है कि वास्तव में नहीं दर्शाया जा सकता हैं लगातार दोहरा हो। उदाहरण के लिए, 0.1 दशमलव बाइनरी में 0.0 (0011) बन जाता है, साथ में 0011 लगातार दोहराता है।
कार्ल बेज़ेलफेल्ट

3
हाँ बिल्कुल। लेकिन आधार में दोहराव नहीं। आधार में दोहराव 2.
रॉबर्ट हार्वे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.