2012-06-10 14 views
13
#include <stdio.h> 
#include <float.h> 

int main() 
{ 
    printf("%f\n", FLT_MAX); 
} 

आउटपुट:मुद्रण बहुत बड़ी चल बिन्दु संख्या जीएनयू से

340282346638528860000000000000000000000.000000 

C और C++ मानकों दोनों परिणामों की अनुमति देते हैं: दृश्य स्टूडियो से

340282346638528859811704183484516925440.000000 

आउटपुट? या क्या वे एक विशिष्ट परिणाम जनादेश करते हैं?

नोट करें कि FLT_MAX = 2^128-2^104 = 340282346638528859811704183484516925440

+3

सी और सी ++ मानकों में एक विशिष्ट फ़्लोटिंग-पॉइंट प्रतिनिधित्व भी जरूरी नहीं है। तो मुझे लगता है कि वे एक विशिष्ट परिणाम जरूरी नहीं कर सकते हैं। – Mysticial

+0

@ माइस्टिसियल वेल, वे अभी भी आम तौर पर यह आदेश दे सकते हैं कि "सटीक मूल्य जो दर्शाया गया है उसे मुद्रित किया जाना चाहिए" या उस सीमा तक कुछ। – fredoverflow

+3

और यूनिक्स विंडोज़ pwns। एक बार फिर। –

उत्तर

6

मुझे लगता है कि C99 मानक के प्रासंगिक भाग 7.19.6.1 पृष्ठ .13 से "अनुशंसित अभ्यास" है:

e के लिए, E, f, F, g, और G रूपांतरण, अगर महत्वपूर्ण दशमलव अंकों की संख्या सबसे अधिक DECIMAL_DIG पर है, तो परिणाम सही ढंग से गोल किया जाना चाहिए। यदि की संख्या महत्वपूर्ण दशमलव अंक DECIMAL_DIG से अधिक है लेकिन स्रोत मान DECIMAL_DIG अंकों के साथ प्रतिनिधित्व योग्य है, तो परिणाम पीछे के शून्यों के साथ सटीक प्रतिनिधित्व होना चाहिए। अन्यथा, स्रोत मान दो आसन्न दशमलव तार एल < यू से घिरा हुआ है, दोनों DECIMAL_DIG महत्वपूर्ण अंक हैं; परिणामी दशमलव स्ट्रिंग डी का मूल्य अतिरिक्त शर्त है कि त्रुटि वर्तमान राउंडिंग दिशा के लिए एक सही संकेत होना चाहिए के साथ पूरा करना चाहिए एल < = डी < = यू,।

मेरी धारणा यह है कि इससे इस मामले में क्या मुद्रित किया जा सकता है में कुछ छूट मिलती है; तो मेरा निष्कर्ष यह है कि वीएस और जीसीसी दोनों यहां अनुपालन कर रहे हैं।

+0

एआरएम ... तो जीएनयू या विजुअल स्टूडियो सही है? :) – fredoverflow

+2

वे दोनों सही हैं, सिर्फ एक को अधिक सटीकता है। –

+5

@ कोलेजोहनसन: किसी के पास अधिक सटीकता नहीं है। जीएनयू आपको लगता है कि यह सोचने के लिए धोखा देती है, लेकिन इसका परिणाम एमएसवीसी की तुलना में भी बदतर है। फ़्लोटिंग पॉइंट * अंतराल * का प्रतिनिधित्व करता है, संख्या नहीं। तो 340282346638528859811704183484516925440, 340282346638528859811704183484516925450, और 340282346638528860000000000000000000000 सभी समान फ़्लोटिंग पॉइंट मान (64-बिट यानी के लिए) हैं। [एक बेहतर फ़्लोटिंग पॉइंट स्वरूपण राउंटिन वास्तव में वह है जो आपको सबसे कम संभव प्रतिनिधित्व देता है] (http://florian.loitsch.com/publications/dtoa-pldi2010.pdf)। – ybungalobill

1

दोनों सी मानक द्वारा अनुमति दी जाती है

खंड 5.2.4.2.2 भाग में (सी ++ सिर्फ सी मानक Inports) एक draft version से 10

निम्न सूची में दिए गए मान होगा कार्यान्वयन-de फाई नेड मानों से अधिक या दिखाया उन लोगों के लिए समान हैं के साथ लगातार भाव द्वारा बदल दिया: - अधिकतम प्रदर्शनीय फाई nite fl oating सूत्री संख्या, (1 - ख -p)
ख Emax

FLT_MAX 1E+37 

और दृश्य C++ 2012

#define FLT_MAX   3.402823466e+38F  /* max value */ 
+0

प्रैक्टिस में, 'FLT_MAX' का मान किसी भी प्लेटफ़ॉर्म पर समान होगा जो IEEE-754 फ़्लोटिंग-पॉइंट का उपयोग करता है। तो यह मुद्दा यहाँ नहीं है। –

+0

@ ओली चेहरल्सवर्थ: ठीक है, शायद "दोषपूर्ण" बहुत मजबूत है। यह अपरिभाषित परिणाम का आह्वान कर रहा है। – wallyk

0

कोड में ही त्रुटिपूर्ण है जहां यह एक float या double में आयोजित महत्व से भी बड़ा एक मूल्य के लिए %f का उपयोग करता है। ऐसा करके आप दशमलव पर रूपांतरण में उत्पन्न अर्थहीन गार्ड बिट्स या अन्य फ़्लोटिंग पॉइंट शोर के रूप में "पर्दे के पीछे" देखने के लिए कह रहे हैं।

स्पष्ट रूप से आपको टोयोटा में होंडा बनाम इंजन बनाने के बाद उत्पन्न धातु फाइलिंग में किसी भी स्थिरता की अपेक्षा नहीं करनी चाहिए। ऐसी स्थिरता की किसी भी समझदार उम्मीद को कभी न मानें।

ऐसी संख्याओं को प्रदर्शित करने का उचित तरीका %g जैसे "वैज्ञानिक" स्वरूपों में से एक का उपयोग करके प्रदान किया गया है, बशर्ते परिशुद्धता अधिक निर्दिष्ट न हो। आईईईई -754 कार्यान्वयन पर, 7 दशमलव आंकड़े float, 0-के लिए 15-16, long double के लिए लगभग 19 और __float128 के लिए 34 के लिए महत्वपूर्ण हैं। इसलिए, उदाहरण के लिए, %.15g उचित होगा, यह मानते हुए कि यह आईईईई -754 कार्यान्वयन पर है।

+1

'% f' का उपयोग करना" त्रुटिपूर्ण "नहीं है। सवाल यह पूछ रहा है कि मानक "पर्दे के पीछे" क्या अनुमति देता है। –

+0

@ ओली चेहरल्सवर्थ: ठीक है, शायद "दोषपूर्ण" बहुत मजबूत है। यह अपरिभाषित परिणाम का आह्वान कर रहा है। – wallyk

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