2013-05-24 2 views
1

다소 기본적인 질문이지만 여기서는 약간 분실되어 있습니다. 나는 복소수로 작동하는 도서관에서 일하고 있습니다. 지금까지 Mac OS 10.8 및 Ubuntu 10.04에서 구현을 사용했습니다 (llvm-gcc를 Man 및 gcc를 사용하여 Ubuntu에서 사용). 어제 icpc (icc/2013.3)를 사용하는 다른 컴퓨터에서 시도했는데 복소수 크런치 부분이 실패했습니다.복소수의 제곱근 - g ++ 대 icpc

#include <iostream> 
#include <complex> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    std::complex<double> tmpcmplxnumber(26.0,0.0); 
    cout << "Number: " << tmpcmplxnumber << endl; 
    std::complex<double> newcmplxnumber = 1.0 - tmpcmplxnumber; 
    cout << "New Number: " << newcmplxnumber << endl; 

    cout << "Sqrt of New Number: " << sqrt(newcmplxnumber) << endl; 

    return 0; 
} 

GCC 출력 (두 시스템) :

Number: (26,0) 
New Number: (-25,-0) 
Sqrt of New Number: (0,-5) 

ICPC 출력 :

Number: (26,0) 
New Number: (-25,0) 
Sqrt of New Number: (0,5) 

내가 연락하고 경우

나는이 간단한 예제를 사용하여 문제를 못을 박았다 정확하게 gcc는 ISO 표준을 구현하므로 결과는 정확해야합니다 (서명 된 0의 모든 항목 ... 등). 따라서 i는 CPC 구현이 '잘못되었습니다'또는 특정 문제에 대한 플래그가 있습니까?

업데이트 두 결과가 모두 수학적 관점에서 유효하다는 것을 알고 있지만, icpc를 사용할 때도 gcc 결과가 필요합니다.

+2

둘 다 정확합니다. 임의의 숫자의 제곱근에는 양수와 음수의 두 가지 솔루션이 있습니다. –

+0

나는 "어느 쪽"이 다른 쪽보다 필연적으로 더 낫다고 확신하지 않지만, 'abs'를 사용하여 서명을 수정하는 방법은 무엇입니까? –

답변

1

sqrt은 일반적으로 수학에서 "제곱근"기호로 표시되는 음수가 아닌 제곱근입니다. 제 (안)에 따르면

표준 (26.4.8, 복잡한 transcendentals이)

인수가 음의 실수 인 경우, 값은 양 허수 축에 놓여 반환.

그래서 gcc가 잘못되었습니다.

+0

그래,하지만 복소수의 sqrt를 얻었고 (그럼에도 불구하고 허수 부는 0 임) icpc는 허수 부의 부호도 바꾸지 않아야한다 (두 번째 줄)? – Stoiker

+0

@Stoiker 제로 허수 부 *가있는 복소수는 실수입니다. 그리고 gcc의'-0'은 나에게 이상하게 보입니다. – molbdnilo