2013-07-19 3 views
10

अगर मैं कोशिश इसफ्लोट करने के लिए डबल डाउनकास्टिंग: अतिप्रवाह व्यवहार की गारंटी है?

float f = (float)numeric_limits<double>::infinity(); 

या वास्तव में, कुछ भी नाव अधिकतम से भी बड़ा एक नाव के लिए नीचे कास्ट करने के लिए प्रयास करते हैं, मैं अनंत के साथ खत्म करने की गारंटी?

यह जीसीसी पर काम करता है, लेकिन क्या यह मानक है?

उत्तर

7

float f = (float)numeric_limits<double>::infinity();

यह अनंत को f सेट करने की गारंटी करता है, तो अपने संकलन मंच (यह आम तौर पर करता है) फ्लोटिंग प्वाइंट संगणना के लिए आईईईई 754 गणित करता है।

या वास्तव में, फ्लोट अधिकतम से अधिक फ्लोट पर कुछ भी बड़ा करने का प्रयास करें, क्या मैं अनंतता के साथ समाप्त होने की गारंटी देता हूं?

नहीं। डिफ़ॉल्ट आईईईई 754 में गोल करने के लिए निकटतम मोड, अधिकतम परिमित float से कुछ ही double मूल्यों (कि, FLT_MAX है) FLT_MAX में बदलने का। सटीक सीमा FLT_MAX (0x1.fffffep127 सी 99 हेक्साडेसिमल प्रतिनिधित्व में) के बीच मिडवे है और अगले float संख्या का प्रतिनिधित्व किया जा सकता है, यदि एकल-परिशुद्धता प्रारूप में एक्सपोनेंट की एक बड़ी श्रृंखला थी, 0x2.0p128। इस प्रकार सीमा 0x1.ffffffp127 या दशमलव में लगभग 3.4028235677973366e + 38 है।

+1

आईईईई 754 अंकगणितीय (जो आम हैं) के साथ-साथ निकटतम मोड में। –

+3

इस उत्तर के संदर्भ में, "कुछ" 536 मिलियन, 870 हजार, 9 11 है। –

6

सी ++ 11 मानक से, §4.8.1:

चल बिन्दु प्रकार का एक prvalue एक और चल बिन्दु प्रकार का एक prvalue में बदला जा सकता। यदि स्रोत मान गंतव्य प्रकार में प्रतिनिधित्व हो सकता है, तो रूपांतरण का परिणाम है जो सटीक प्रतिनिधित्व करता है। यदि स्रोत मान दो निकट गंतव्य मानों के बीच है, तो रूपांतरण का परिणाम उन मानों में से किसी एक के कार्यान्वयन-परिभाषित विकल्प है। अन्यथा, व्यवहार अपरिभाषित है।

इसका मतलब है कि

  • आप डबल अनंत फ्लोट करने के लिए डाली हैं, तो आप नाव अनंत मिलता है।

  • यदि आप एक डबल वैल्यू डालें, जो फ़्लोट अधिकतम और अनंत के बीच है, तो फ्लोट करने के लिए, तो आपको फ्लोट अधिकतम या फ्लोट अनंतता मिलती है।

+1

प्रश्न का पहला भाग अनंतता के बारे में है, जिसे गंतव्य प्रकार में बिल्कुल दर्शाया जा सकता है, नहीं? –

+0

@ पास्कल क्यूओक: मैंने जवाब संशोधित किया है। – user763305

+1

@ user763305 यह एक दिलचस्प व्याख्या है; मैंने कभी इसके बारे में सोचा नहीं था, लेकिन आप सही हैं: 'FLT_MAX' से अधिक मान' FLT_MAX' और 'Inf' के बीच हैं, इसलिए व्यवहार मानक द्वारा अच्छी तरह से परिभाषित किया गया है। (भले ही यह नहीं था, यह आईईईई द्वारा परिभाषित किया गया है।) –

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