पहला पूर्णांक जो IEEE 754 फ़्लोट वास्तव में प्रतिनिधित्व करने में असमर्थ है?


162

स्पष्टता के लिए, यदि मैं IEE 754 फ़्लोट्स को लागू करने वाली भाषा का उपयोग कर रहा हूं और मैं घोषणा करता हूं:

float f0 = 0.f;
float f1 = 1.f;

... और फिर उन्हें वापस प्रिंट करें, मुझे 0.0000 और 1.0000 मिलेंगे - बिल्कुल।

लेकिन IEEE 754 वास्तविक संख्या के साथ सभी नंबरों का प्रतिनिधित्व करने में सक्षम नहीं है। शून्य के करीब, 'अंतराल' छोटे हैं; जैसे-जैसे आप आगे बढ़ते जाते हैं, अंतराल और बड़ा होता जाता है।

तो, मेरा सवाल यह है: एक IEEE 754 फ्लोट के लिए, जो कि पहले (निकटतम से शून्य) पूर्णांक है जो वास्तव में प्रतिनिधित्व नहीं किया जा सकता है? मैं केवल 32-बिट फ़्लोट्स के लिए वास्तव में चिंतित हूं, हालांकि मुझे 64-बिट के लिए उत्तर सुनने में दिलचस्पी होगी अगर कोई इसे देता है!

मैंने सोचा कि यह 2 बिट्स_ऑफ_मैंटिसा की गणना करने और 1 को जोड़ने के रूप में सरल होगा , जहां बिट्स_ऑफ_मैंटिसा मानक बिट्स को कितने बिट्स है। मैंने अपनी मशीन (MSVC ++, Win64) पर 32-बिट फ़्लोट्स के लिए ऐसा किया था, और यह ठीक लग रहा था, हालांकि।


यदि आप एक अप्रतिबंधित संख्या चाहते थे तो आपने उसे क्यों जोड़ा? और आपने किस नंबर का उपयोग किया या प्राप्त किया? और क्या यह होमवर्क है? और आपका प्रश्न शीर्षक "पूर्णांक" कहता है, लेकिन आपका प्रश्न "फ्लोट" कहता है।
msw

5
क्योंकि मुझे लगा कि मंटिसा को अधिकतम करने से मुझे सबसे अधिक प्रतिनिधित्व योग्य संख्या मिलेगी। 2 ^ 22। नहीं, यह एक जिज्ञासा का सवाल है। मुझे हमेशा से लगता है कि जब मैं जानता हूं कि दोषी हमेशा तैरता रहता है, तब भी मैं तैरने में देर लगा देता हूं। मैं जानना चाहता हूं कि ऊपरी सीमा क्या है। जहां तक ​​मैं बता सकता हूं, शीर्षक और प्रश्न एक ही हैं, बस अलग तरह से अभिव्यक्त किया गया है।
फ्लोमी



1
@KyleStrand ने वापस लिया ^ 2। मुझे नहीं पता कि उस समय कोई मुझे दूसरे से ज्यादा सही क्यों लग रहा था। अब वे दोनों "बिट्स की संख्या ..." की तुलना में बहुत अजीब लगते हैं
पास्कल क्यूक

जवाबों:


211

2 मंटिसा बिट्स + 1 + 1

प्रतिपादक में +1 (मंटिसा बिट्स + 1) है, क्योंकि अगर मंटिसा में abcdef...वह संख्या है 1.abcdef... × 2^e, जो वास्तव में प्रतिनिधित्व करती है , तो अतिरिक्त सटीकता का एक अतिरिक्त निहितार्थ प्रदान करती है।

इसलिए, पहला पूर्णांक जिसे सही ढंग से दर्शाया नहीं जा सकता है और इसे गोल किया जाएगा:
For float, 16,777,217 (2 24 + 1)।
के लिए double, 9,007,199,254,740,993 (2 53 + 1)।

>>> 9007199254740993.0
9007199254740992

मैंने इसकी घोषणा की floatऔर इसे 16,777,217 के बराबर सेट किया। लेकिन जब मैंने इसका उपयोग करके coutइसे छापा तो इसका परिणाम 16,777,216 हुआ। मैं उपयोग कर रहा हूं C++। मुझे 16,777,217 क्यों नहीं मिल सकते हैं?
सोडियमनाइट्रेट

18
@sodiumnitrate प्रश्न शीर्षक की जाँच करें। 16777217 पहला पूर्णांक है जो वास्तव में प्रतिनिधित्व करने में असमर्थ है।
kennytm

ठीक है धन्यवाद। मैं उलझन में पड़ गया, इस बारे में खेद है। हालांकि मेरा एक और सवाल है: 16777216 के बाद, अगला पूर्णांक जो 2 * 16777216 होना चाहिए, प्रतिनिधित्व योग्य नहीं होना चाहिए? जब मैं एक समान कार्यक्रम चलाता हूं, तो मुझे 2 से 16777126 को जोड़कर 16777218 मिलता है।
सोडियमटाइट्रेट

5
अगला पूर्णांक वास्तव में 16777218 है, क्योंकि 2 अब अंतिम महत्वपूर्ण द्विआधारी अंक बन गया है।
kennytm 7

6
C ++ में, वह (1 << std::numeric_limits<float>::digits) + 1, और C में (1 << FLT_MANT_DIG) + 1,। पूर्व अच्छा है क्योंकि यह एक टेम्पलेट का हिस्सा हो सकता है। यदि आप अभी सबसे बड़ा प्रतिनिधित्व योग्य पूर्णांक चाहते हैं तो +1 न जोड़ें।
हेनरी स्क्रिनर

38

N बिट पूर्णांक द्वारा दर्शाने वाला सबसे बड़ा मान 2 n -1 है। जैसा कि ऊपर उल्लेख किया गया है, floatमहत्व में परिशुद्धता के 24 बिट्स हैं जो यह प्रतीत होता है कि 2 24 फिट नहीं होगा।

हालाँकि

घातांक की सीमा के भीतर 2 की शक्तियां 1.0 × 2 n के रूप में बिल्कुल प्रतिनिधित्व योग्य हैं , इसलिए 2 24 फिट हो सकते हैं और परिणामस्वरूप float2 24 +1 के लिए पहला अप्राप्य पूर्णांक है । जैसा कि ऊपर उल्लेखित है। फिर।


1
यह स्पष्ट रूप से दूसरे के "सटीक अतिरिक्त बिट" भाग को स्पष्ट करता है। धन्यवाद।
18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.