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::gcdyield 가 되어야합니다 10.

특히 두 피연산자 의 절대 값 은 공통 유형으로 표시 할 수 있어야합니다 .

| m | 또는 | n | type의 값으로 표현할 수없는 std::common_type_t<M, N>경우 동작이 정의되지 않습니다.

그러나 첫 번째 호출은을 반환합니다 2. 여기에 뭔가 빠졌습니까? gcc와 clang은이 방식으로 작동합니다.


흥미롭게도 GCC는 값 만 int를 인쇄에 2의 int를 컴파일하고 서명하지 않습니다 : godbolt.org/z/koEVHh
앨런 Birtles

무엇입니까 -120 % 10u? (힌트 : 0이 아닙니다.) 그렇습니다.
TC

@TC 예는 캐스팅 -120unsigned발생합니다 4294967176하는 % 10u것입니다 6. 내 행동은 실제로이 행동이 실제로 부정확 한 것인지에 대한 것이 었습니다.
dave

@AlanBirtles이 경우에 캐스트 unsigned되지 않으므로 버그도 없습니다.
dave

답변:


10

libstc ++의 버그처럼 보입니다. -stdlib=libc++CE 명령 줄에 추가하면 다음 과 같은 이점이 있습니다.

-120 120
10 10
10
10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.