what is type conversion in c++




सी में एक अंतर चर के लिए एक डबल सटीक संख्या के असाइनमेंट का गैर-अनुवांशिक परिणाम (3)

... मुझे दो अलग-अलग नंबर क्यों मिले ...

सामान्य फ्लोट-पॉइंट मुद्दों के अलावा, b और c लिए गणना पथ अलग-अलग तरीकों से आते हैं। c की गणना पहले मूल्य को double a बचाकर की जाती है।

double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;

सी व्यापक प्रकार का उपयोग करके मध्यवर्ती फ्लोटिंग-पॉइंट गणित की गणना करने की अनुमति देता है। FLT_EVAL_METHOD का मान <float.h>

असाइनमेंट और कास्ट (जो सभी अतिरिक्त रेंज और परिशुद्धता को हटा दें) को छोड़कर, ...

-1 अनिश्चित;

0 केवल प्रकार की सीमा और परिशुद्धता के लिए सभी संचालन और स्थिरांक का मूल्यांकन करें;

1 प्रकार के float संचालन और स्थिरांक का मूल्यांकन और रेंज और double प्रकार की सटीकता के लिए double , long double संचालन और निरंतरता का मूल्यांकन रेंज और long double प्रकार की परिशुद्धता के लिए;

2 long double प्रकार की सीमा और परिशुद्धता के लिए सभी संचालन और स्थिरांक का मूल्यांकन करते हैं।

C11dr 115.2.4.2.2 9

ओपी ने 2 की सूचना दी

भागफल double a = (Vmax-Vmin)/step; में भागफल को बचाकर double a = (Vmax-Vmin)/step; , सटीकता को double करने के लिए मजबूर किया जाता है जबकि int b = (Vmax-Vmin)/step; long double रूप में गणना कर सकता है।

यह सूक्ष्म अंतर (Vmax-Vmin)/step (शायद long double रूप में गणना की गई) से एक double बनाम शेष long double रूप में सहेजा जा रहा है। एक के रूप में 15 (या सिर्फ ऊपर), और दूसरे के तहत 15. int ट्रंकेशन इस अंतर को 15 और 14 तक बढ़ाता है।

एक अन्य संकलक पर, परिणाम दोनों FLT_EVAL_METHOD < 2 या अन्य फ़्लोटिंग-पॉइंट विशेषताओं के कारण समान हो सकते हैं।

फ्लोटिंग-पॉइंट नंबर से int रूपांतरण एक पूर्ण संख्या के पास संख्याओं के साथ गंभीर है। अक्सर बेहतर round() या lround() । सबसे अच्छा समाधान स्थिति निर्भर है।

क्या कोई मुझे स्पष्टीकरण दे सकता है कि मुझे दो अलग-अलग संख्याएं क्यों मिलती हैं, सम्मान। 14 और 15, निम्न कोड से आउटपुट के रूप में?

#include <stdio.h>  

int main()
{
    double Vmax = 2.9; 
    double Vmin = 1.4; 
    double step = 0.1; 

    double a =(Vmax-Vmin)/step;
    int b = (Vmax-Vmin)/step;
    int c = a;

    printf("%d  %d",b,c);  // 14 15, why?
    return 0;
}

मैं दोनों मामलों में 15 पाने की उम्मीद करता हूं, लेकिन ऐसा लगता है कि मुझे भाषा के कुछ मूल तत्व याद आ रहे हैं।

मुझे यकीन नहीं है कि यह प्रासंगिक है लेकिन मैं कोडब्लॉक में परीक्षण कर रहा था। हालाँकि, यदि मैं कुछ ऑन-लाइन कंपाइलर ( उदाहरण के लिए एक ) में कोड की समान पंक्तियाँ टाइप करता हूँ तो मुझे दो मुद्रित चर के लिए 15 का उत्तर मिलता है।


"सरल" उत्तर यह है कि उन प्रतीत होता है-सरल संख्या 2.9, 1.4, और 0.1 सभी को आंतरिक रूप से द्विआधारी फ्लोटिंग बिंदु के रूप में दर्शाया गया है, और बाइनरी में, संख्या 1/10 को असीम रूप से दोहराए जाने वाले द्विआधारी अंश 0.0001100110011009 के रूप में दर्शाया गया है ... [ 2] । (यह दशमलव के 1/3 तरीके से दशमलव के 0.333333333 ... के अनुरूप है।) वापस दशमलव में परिवर्तित हो गया, उन मूल संख्याओं का अंत 2.8999999999, 1.3999999999 और 0.0999999999 जैसी चीजों से हो रहा है। और जब आप उन पर अतिरिक्त गणित करते हैं, तो उन .0999999999 का प्रसार होता है।

और फिर अतिरिक्त समस्या यह है कि जिस पथ से आप कुछ गणना करते हैं - चाहे आप इसे किसी विशेष प्रकार के मध्यवर्ती चर में संग्रहीत करते हैं, या इसे "सभी पर एक साथ" गणना करते हैं, जिसका अर्थ है कि प्रोसेसर आंतरिक रजिस्टरों का उपयोग कर सकता है प्रकार से अधिक सटीक। double - एक महत्वपूर्ण अंतर बना सकते हैं।

लब्बोलुआब यह है कि जब आप एक double बैक को int , तो आप लगभग हमेशा राउंड करना चाहते हैं, न कि ट्रंकेट। यहां जो हुआ वह यह था कि (प्रभाव में) एक गणना पथ ने आपको 15.0000000001 दिया, जो कि घटकर 15 हो गया, जबकि दूसरे ने आपको 14.999999999 प्रदान किया जिसने सभी को 14 तक नीचे कर दिया।

C सामान्य प्रश्न सूची में 14.4a प्रश्न भी देखें।


FLT_EVAL_METHOD == 2 के C कार्यक्रमों के विश्लेषण में समतुल्य समस्या का विश्लेषण किया जाता है

यदि FLT_EVAL_METHOD==2 :

double a =(Vmax-Vmin)/step;
int b = (Vmax-Vmin)/step;
int c = a;

एक long double अभिव्यक्ति का मूल्यांकन करके b गणना करता है, फिर इसे int ट्रंक करता है, जबकि c यह long double से मूल्यांकन करता है, इसे double और फिर int करने के लिए int

तो दोनों मान एक ही प्रक्रिया से प्राप्त नहीं होते हैं, और इससे विभिन्न परिणाम हो सकते हैं क्योंकि अस्थायी प्रकार सामान्य सटीक अंकगणित प्रदान नहीं करता है।





implicit-conversion