এটি কি 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;
}

সংকলক এক্সপ্লোরার চালান

সিপ্রিফারেন্স অনুসারে উভয় কলই std::gcdউত্পন্ন করা উচিত 10, কারণ সমস্ত পূর্বশর্তগুলি সন্তুষ্ট।

বিশেষত, এটি কেবলমাত্র উভয় অপারেন্ডের পরম মানগুলি তাদের সাধারণ ধরণের ক্ষেত্রে উপস্থাপনযোগ্য:

হয় যদি | মি | বা | এন | প্রকারের মান হিসাবে উপস্থাপনযোগ্য নয় std::common_type_t<M, N>, আচরণটি সংজ্ঞায়িত।

তবুও প্রথম কল রিটার্ন করে 2। আমি কি এখানে কিছু মিস করছি? জিসিসি এবং ঝনঝন উভয়ই এ জাতীয় আচরণ করে।


আকর্ষণীয়ভাবে জিসিসি 2 টি ইন্টিকে সংকলন করে কেবল মানটি মুদ্রণ করে তবে কোনও পূর্বনির্ধারিত
অ্যালান

কি -120 % 10u? (ইঙ্গিত: এটি 0 নয়) হ্যাঁ, বাগ।
টিসি

@TC হ্যাঁ, ভোটদান -120থেকে unsignedফল হবে 4294967176যা % 10uহয় 6। আমার প্রশ্নটি বরং এটি ছিল যদি এই আচরণটি সত্যই ভুল হয়, যা এটি বলে মনে হয়।
ডেভ

@ অ্যালানবার্টলস সে ক্ষেত্রে থের কোনও কাস্ট করা হবে না unsigned, তাই কোনও বাগও নেই
ডেভ

উত্তর:


10

Libstc ++ এ একটি বাগের মতো দেখায়। আপনি যদি -stdlib=libc++সিই কমান্ড লাইনে যুক্ত হন তবে আপনি পাবেন:

-120 120
10 10
10
10
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.