% F बड़े मूल्यों को क्यों प्रिंट करता है जब फ्लोटिंग पॉइंट कॉन्स्टेंट को चर के बजाय पास किया जाता है?


9

दिए गए कार्यक्रम में मुझे प्रत्येक के लिए अलग-अलग परिणाम क्यों मिले printf?

#include <stdio.h>
int main()
{
    float c = 4.4e10;
    printf("%f\n", c);
    printf("%f\n", 4.4e10);
    return 0;
}

और यह निम्न आउटपुट दिखाता है:

44000002048.000000
44000000000.000000

4
अब तक दिए गए उत्तर बताते हैं कि 4.4e10एक doubleस्थिरांक है जिसे floatप्रारंभ में परिवर्तित किया cजाता है लेकिन doubleजब इसे पारित किया जाता है printf। हालाँकि, आप यह भी जानना पसंद कर सकते हैं कि एक fप्रत्यय जोड़ने से यह floatस्थिर हो जाता है: मुद्रण 4.4e10fउसी मूल्य को दिखाएगा जो कि प्रारंभ cकरने से उत्पन्न होता है 4.4e10f। भेद floatसे स्थिरांक doubleस्थिरांक फ्लोटिंग प्वाइंट गणित के साथ गुणवत्ता काम कर रही करने के लिए महत्वपूर्ण हो सकता है।
एरिक पोस्टपिसिल

क्या इस रूपांतरण विधि का नाम कुछ भी है? मैं इसके बारे में पढ़ना चाहता हूं।
15:100 बजे user10056563

आप को पता है जब से रूपांतरण करना चाहते हैं doubleके लिए floatसी भाषा में होता है? या क्या आप जानना चाहते हैं कि रूपांतरण से क्या परिणाम निकलते हैं, यानी रूपांतरण के क्या प्रभाव होते हैं? या कुछ और?
बजे एरिक पोस्टपिसिल

मैं पूछताछ कर रहा हूँ यहाँ उत्तर और न ही मानक लेकिन, जब मैं छोटा था और सीखने Cहम इस्तेमाल किया printf("%f",x)एक के लिए floatऔर printf("%lf",x)एक के लिए double। चीजें कब बदलीं? और एक (एकल) को स्पष्ट रूप से कैसे प्रिंट किया जाएगा float- printf("%hf",x)??
एड्रियन मोल

2
@ प्रिंट %lfमें एड्रियन वही चीज़ है जो %f। एक floatएक चर तर्क में एक में बदल जाता है doubleसंकलक द्वारा, एक जैसे shortएक में परिवर्तित हो जाती int
एसएस ऐनी

जवाबों:


9

A floatएक प्रकार है जो 32-बिट फ़्लोटिंग पॉइंट नंबर रखता है, जबकि स्थिरांक 4.4e10एक का प्रतिनिधित्व करता है double, जो एक 64-बिट फ़्लोटिंग पॉइंट नंबर (यानी एक डबल- डिप्रेशन फ़्लोटिंग पॉइंट नंबर) रखता है

जब आप असाइन 4.4e10करते हैं c, तो मान 4.4e10का सटीक रूप से प्रतिनिधित्व नहीं किया जा सकता है (मान्टिसा नामक पैरामीटर में एक गोल त्रुटि), और निकटतम संभव मान (44000002048) संग्रहीत है। जब इसे पास किया जाता है printf, तो इसे राउंडिंग त्रुटि सहित वापस प्रचारित किया जाता है double

दूसरे मामले में, मान एक doubleसंपूर्ण समय होता है, बिना संकुचित और चौड़ा किए, और ऐसा होता है कि doubleमूल्य का प्रतिनिधित्व कर सकता है।

इस अवांछनीय व्यवहार है, तो आप घोषणा कर सकते हैं cएक के रूप में doubleएक के लिए थोड़ा और अधिक सटीक (लेकिन सावधान रहना है कि आप अभी भी सटीक सीमाओं को पार कर जाएगा अंत में)।


3

आप वास्तव में दो अलग-अलग प्रकारों के मूल्यों को यहां छाप रहे हैं।

पहले मामले में आप एक वैरिएबल के प्रकार को मान दे रहे हैं float। A की सटीकता floatलगभग 6 या 7 दशमलव अंक है, इसलिए जब तक कि मूल्य का प्रतिनिधित्व नहीं किया जा सकता है, तब तक आप निकटतम मान देखेंगे जो उस प्रकार से दर्शाया जा सकता है।

दूसरे मामले में आप स्थिरांक पास कर रहे हैं 4.4e10जिसमें टाइप है double। इस प्रकार की सटीकता के लगभग 16 दशमलव अंक होते हैं, और मान उस सीमा के भीतर होता है, इसलिए सटीक मूल्य मुद्रित होता है।


क्यों यह विशेष रूप से 2048 के अंत में प्रिंट करता है?
15:100 बजे user10056563

@ user10056563 क्योंकि यह 4.4e10 के लिए निकटतम संख्या है जिसे 32 बिट फ्लोट में संग्रहीत किया जा सकता है।
dbush
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.