c++ - फ्लोटिंग-पॉइंट प्रमोशन: स्ट्राउटस्ट्रॉप बनाम कंपाइलर-जो सही है?



c++11 (2)

Stroustrup की नई किताब "सी ++ प्रोग्रामिंग भाषा - चौथी संस्करण" के खंड 10.5.1 में, वह कहते हैं, एक अंकगणितीय आपरेशन के पहले किया गया है, इंटीग्रल पदोन्नति का उपयोग छोटे पूर्णांक प्रकारों में से बाहर करने के लिए किया जाता है, और इसी तरह, फ्लोटिंग-पॉइंट प्रमोशन फ्लोट्स के बाहर युगल बनाने के लिए इस्तेमाल किया

मैंने निम्नलिखित कोड के साथ पहले दावे की पुष्टि की:

#include <iostream>
#include <typeinfo>

int main()
{
    short a;
    short b;
    std::cout << typeid(a + b).name() << std::endl;
}

यह जीसीसी के साथ वीसी ++ और "आई" के साथ "इंट" आउटपुट देता है

लेकिन शॉर्ट्स के बजाए फ्लोट्स के साथ परीक्षण करना, आउटपुट अब भी "फ्लोट" या "एफ" है:

#include <iostream>
#include <typeinfo>

int main()
{
    float a;
    float b;
    std::cout << typeid(a + b).name() << std::endl;
}

स्ट्राउटस्ट्रुप के अनुसार फ्लोटिंग प्वाइंट प्रोमोशन-नियम के लिए कोई अपवाद नहीं है, इसलिए मुझे उम्मीद है कि "डबल" या "डी" आउटपुट के रूप में।

पदोन्नति के बारे में उल्लिखित खंड गलत है या किसी तरह अस्पष्ट है? और क्या प्रकार के प्रचार के संबंध में सी ++ 98 और सी ++ 11 में कोई अंतर है?

https://src-bin.com


Answer #1

मुझे नहीं पता है कि स्ट्राउटस्ट्रोप की किताब क्या कहती है, लेकिन मानक के अनुसार, float एस इस मामले में double एस में परिवर्तित नहीं किया जाएगा। अधिक अंकगणित बाइनरी ऑपरेटरों को लागू करने से पहले 5p9 में वर्णित सामान्य अंकगणित रूपांतरण लागू होते हैं:

  • यदि या तो परिचालित स्कॉड गणना प्रकार (7.2) का होता है, तो कोई रूपांतरण नहीं होता है; अगर अन्य ऑपरेंड में एक ही प्रकार का नहीं है, तो अभिव्यक्ति गलत रूप से बनती है।
  • यदि या तो ऑपरेंड लंबे प्रकार के प्रकार के होते हैं, तो दूसरे को लंबे समय तक दो बार बदल दिया जाएगा।
  • अन्यथा, यदि कोई ऑपरेंड दोगुना हो, तो दूसरे को दो में बदल दिया जाएगा।
  • अन्यथा, यदि कोई ऑपरैंट फ्लोट है, तो दूसरे को फ्लोट में कनवर्ट किया जाएगा।
  • अन्यथा, अभिन्न प्रचार (4.5) दोनों ऑपरेंडों पर किया जाएगा। [...]

इंटीग्रल प्रोन्नति हैं, जो दो short एस को int एस में परिवर्तित किया जा सकता है। लेकिन इन नियमों के अनुसार दो float को double एस में परिवर्तित नहीं किया जाएगा। यदि आप एक float को double जोड़ते हैं, तो float को double परिवर्तित कर दिया जाएगा।

उपरोक्त सी ++ 11 से है सी ++ 03 में एक ही नियम शामिल हैं, सिवाय इसके कि स्कॉड एन्यूमरेशन का उल्लेख किया जाए।


Answer #2

इस बीच Stroustrup को मान्यता प्राप्त लगता है कि संदर्भ वाक्य सही नहीं है या कम से कम भ्रामक है। उन्होंने खंड 10.5.1 से फ्लोटिंग पॉइंट प्रमोशन के बारे में वाक्य निकाल दिया है।

Stroustrup के वेब पेज पर 4 वें संस्करण की तीसरी छपाई की इरेटा देखें:

पेज 267: एस / इसी प्रकार, फ्लोटिंग-पॉइंट प्रोमोशन को फ्लोट्स से डबल्स बनाने के लिए प्रयोग किया जाता है।

(टिप्पणी: अभिव्यक्ति s / regexp / प्रतिस्थापन / sed unix उपकरण शब्दों के समान है। यह पैटर्न regexp की खोज करता है और इसे प्रतिस्थापन के साथ बदल देता है। हमारे मामले में कुछ भी नहीं।)