2013-03-26 5 views
5

के रूप में सटीक रूप से व्यक्त किया जा सकता है, (संगत) पूर्णांक की सटीक सीमा क्या है जिसे डबल (रेस फ्लोट?) के रूप में व्यक्त किया जा सकता है। कारण मैं पूछता हूं क्योंकि मैं questions such as this one के लिए उत्सुक हूं सटीकता का नुकसान होगा।पूर्णांक की रेंज जिसे फ़्लोट/डबल्स

  1. कम से कम सकारात्मक पूर्णांक m ऐसी है कि m+1 ठीक एक डबल के रूप में नहीं व्यक्त किया जा सकता है है (resp। तैरने लगते हैं)?
  2. सबसे बड़ा नकारात्मक पूर्णांक -n क्या है -n-1 को डबल (रेस फ्लोट) के रूप में सटीक रूप से व्यक्त नहीं किया जा सकता है? (ऊपर जैसा ही हो सकता है)।

इसका मतलब है कि -n और m के बीच प्रत्येक पूर्णांक में सटीक फ़्लोटिंग-पॉइंट प्रस्तुति है। मैं मूल रूप से फ्लोट्स और युगल दोनों के लिए [-n, m] श्रेणी की तलाश में हूं।

चलिए standard IEEE 754 32-बिट और 64-बिट फ़्लोटिंग पॉइंट प्रस्तुतियों के दायरे को सीमित करते हैं। मुझे पता है कि फ्लोट में 24 बिट सटीक हैं और डबल में 53 बिट्स हैं (दोनों एक छिपे हुए प्रमुख बिट के साथ), लेकिन फ्लोटिंग पॉइंट प्रस्तुति की जटिलताओं के कारण मैं इसके लिए एक आधिकारिक उत्तर ढूंढ रहा हूं। कृपया अपने हाथों को मत बढ़ाओ!

(आदर्श जवाब साबित हो सकता है कि 0 से m के सभी पूर्णांकों में व्यक्त कर रहे हैं, और कहा कि m+1 नहीं है।)

उत्तर

6

जब से तुम आईईईई फ्लोटिंग प्वाइंट प्रकार के बारे में पूछ रहे हैं, भाषा फर्क नहीं पड़ता।

#include <iostream> 
using namespace std; 

int main(){ 

    float f0 = 16777215.; // 2^24 - 1 
    float f1 = 16777216.; // 2^24 
    float f2 = 16777217.; // 2^24 + 1 

    cout << (f0 == f1) << endl; 
    cout << (f1 == f2) << endl; 

    double d0 = 9007199254740991.; // 2^53 - 1 
    double d1 = 9007199254740992.; // 2^53 
    double d2 = 9007199254740993.; // 2^53 + 1 

    cout << (d0 == d1) << endl; 
    cout << (d1 == d2) << endl; 
} 

आउटपुट:

0 
1 
0 
1 

तो नाव के लिए सीमा 2^24 है। और डबल के लिए सीमा 2^53 है। नकारात्मक एक ही हैं क्योंकि केवल एक ही अंतर संकेत बिट है।

+0

मैंने भाषाओं के साथ टैग किया क्योंकि मेरे द्वारा किए गए अन्य टैग के लिए कोई ट्रैफ़िक नहीं था। यद्यपि आपके उत्तर के लिए धन्यवाद! –

+0

क्यूरम के अपने विश्लेषण में मृत-पर। लेकिन यदि आप एक अनुभवजन्य समाधान चाहते हैं, तो बस लूप के साथ परीक्षण करें: 'फ्लोट एफ = 0; के लिए (; ++ एफ) {अगर (एफ == (एफ + 1)) {cout << f; टूटना; }} '। युगल और नकारात्मक के लिए समान है। –

संबंधित मुद्दे