यह std :: gcd में एक बग है?


14

मैं इस व्यवहार से आया std::gcdहूं कि मुझे अप्रत्याशित लगा:

#include <iostream>
#include <numeric>

int main()
{
    int      a = -120;
    unsigned b =  10;

    //both a and b are representable in type C
    using C = std::common_type<decltype(a), decltype(b)>::type;
    C ca = std::abs(a);
    C cb = b;
    std::cout << a << ' ' << ca << '\n';
    std::cout << b << ' ' << cb << '\n';

    //first one should equal second one, but doesn't
    std::cout << std::gcd(a, b) << std::endl;
    std::cout << std::gcd(std::abs(a), b) << std::endl;
}

कंपाइलर एक्सप्लोरर पर चलाएं

के अनुसार cppreference दोनों कॉल करने के लिए std::gcdउपज चाहिए 10, के रूप में सभी पूर्व शर्त संतुष्ट हैं।

विशेष रूप से, यह केवल आवश्यक है कि दोनों ऑपरेंड के पूर्ण मान उनके सामान्य प्रकार में प्रतिनिधित्व करने योग्य हों:

यदि या तो | एम | या | n | प्रकार के मूल्य के रूप में प्रतिनिधित्व करने योग्य नहीं है std::common_type_t<M, N>, व्यवहार अपरिभाषित है।

फिर भी पहला कॉल रिटर्न 2। क्या मुझसे कोई चूक हो रही है? Gcc और clang दोनों इस तरह से व्यवहार करते हैं।


दिलचस्प बात यह है कि 2 ints सिर्फ मूल्य प्रिंट करने के लिए संकलित करता है, लेकिन एक int और अहस्ताक्षरित नहीं करता है: godbolt.org/z/koEVHh
एलन

क्या है -120 % 10u? (संकेत: यह 0. नहीं है) हाँ, बग।
TC

@TC हाँ, कास्टिंग -120के लिए unsignedपरिणाम होगा में 4294967176जो % 10uहै 6। मेरा प्रश्न यह था कि क्या यह व्यवहार वास्तव में गलत है, जो ऐसा लगता है।
डेव

@AlanBirtles उस मामले में, थ्रू कास्ट नहीं किया जाएगा unsigned, इसलिए कोई बग भी नहीं है
dave

जवाबों:


10

Libstc ++ में बग जैसा दिखता है। यदि आप -stdlib=libc++CE कमांड लाइन में जोड़ते हैं , तो आपको मिलेगा:

-120 120
10 10
10
10
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.