นี่เป็นข้อบกพร่องใน 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;
}

ทำงานบนคอมไพเลอร์ explorer

ตามcppreferenceทั้งการโทรไปยังstd::gcdควรผลผลิต10เป็นปัจจัยพื้นฐานทั้งหมดมีความพึงพอใจ

โดยเฉพาะอย่างยิ่งมันเป็นสิ่งจำเป็นเท่านั้นที่ค่าสัมบูรณ์ของตัวถูกดำเนินการทั้งสองจะเป็นตัวแทนในประเภททั่วไปของพวกเขา:

หาก | m | หรือ | n | ไม่สามารถแทนค่าได้เป็นประเภทstd::common_type_t<M, N>ซึ่งลักษณะการทำงานนั้นไม่ได้กำหนดไว้

แต่สายแรกกลับ2มา ฉันทำอะไรบางอย่างหายไปหรือเปล่า ทั้ง gcc และ clang นั้นทำหน้าที่นี้


gcc ที่น่าสนใจรวบรวม 2 int เพียงพิมพ์ค่า แต่ int และผู้ที่ไม่ได้ลงนามไม่ได้: godbolt.org/z/koEVHh
Alan Birtles

อะไรนะ-120 % 10u? (คำแนะนำ: ไม่ใช่ 0) ใช่ข้อผิดพลาด
TC

@TC ใช่หล่อ-120ไปunsignedจะส่งผล4294967176ที่เป็น% 10u 6คำถามของฉันค่อนข้างหากพฤติกรรมนี้ไม่ถูกต้องซึ่งดูเหมือนว่าจะเป็น
dave

@AlanBirtles ในกรณีที่บิดาจะโยนไปที่ใดunsignedดังนั้นข้อผิดพลาดอย่างใดอย่างหนึ่ง
dave

1
รายงานว่าเป็นgcc.gnu.org/bugzilla/show_bug.cgi?id=92978
TC

คำตอบ:


10

ดูเหมือนข้อบกพร่องใน libstc ++ ถ้าคุณเพิ่ม-stdlib=libc++ในบรรทัดคำสั่ง CE คุณจะได้รับ:

-120 120
10 10
10
10
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.