2012-05-14 5 views
13

Inf + Inf * j와 같은 복소 무한대를 만들려고하는데 여기서 j는 복소수 변수입니다. 나는이 작업을 수행 할 때 :C++에서 std :: complex와 complex 무한대 만들기

#include <complex> 
#include <limits> 
using std; 

... 

complex<double> attempt1 = 
    complex<double>(numeric_limits<double>::infinity(), 
        numeric_limits<double>::infinity()); 

는 복잡한 NaN (숫자 + Inf를 *의 J)를 반환합니다.

complex<double> attempt2 = 
    complex<double>(numeric_limits<double>::infinity()); 

그러나

는 복소수 (Inf를 + 0 *의 J)를 반환한다. 또한

:

complex<double> attempt_at_imag_inf = 
    complex<double>(any_value_here, numeric_limits<double>::infinity()); 

는 복소수 (NaN이 + Inf를 *의 J)를 반환한다.

여기에 무슨 일이 일어나는지 아는 사람이 있습니까? 허수 부에 대해 무언가를 시도 할 때마다 NaN이 실제 부분에 쓰여집니다.

위의 내용은 NaN과 Infinity를 지원하는 유형에만 적용됩니다. 나는 g ++ v4.6.1을 사용하고있다. numeric_limits 헤더를 살펴 봤는데 위와 같은 일이 전혀 일어나지 않을 것이라는 징후가 없습니다.

위의 내용을 문맥에 넣으려면 실제로 complex의 numeric_limits를 부분적으로 특수화해야합니다. 이 문제를 고려해 주셔서 고맙습니다. ORIGINAL POST

TO

개정

내가 문제를 설명하는 완벽한하지만 쇼트 프로그램을 제공하고 있습니다. 또한 결과를 생성하기 위해 프로그램을 컴파일하는 방법에 대한 좀 더 적합한 정보를 포함 시켰습니다. -std = C + +0 옵션을 사용하지 않으면

my_complex_inf = (nan,inf) 
attempt2 = (inf,0) 
attempt_at_imag_inf = (nan,inf) 

: g에 위의 컴파일

#include <iostream> 
#include <complex> 
#include <limits> 

using namespace std; 

int main(int argc, char* argv[]) 
{ 

    complex<double> my_complex_inf = 
     complex<double>(numeric_limits<double>::infinity(), 
         numeric_limits<double>::infinity()); 

    cout << "my_complex_inf = " << my_complex_inf << endl; 

    complex<double> attempt2 = 
     complex<double>(numeric_limits<double>::infinity()); 

    cout << "attempt2 = " << attempt2 << endl; 

    double any_value_here = 0; 

    complex<double> attempt_at_imag_inf = 
     complex<double>(0, numeric_limits<double>::infinity()); 

    cout << "attempt_at_imag_inf = " << attempt_at_imag_inf << endl; 

    return 0; 

} 

-std = C + +0 우분투에 ++ 버전 4.6.1은 다음과 같은 결과를 얻을 수 결과는 다음과 같습니다

my_complex_inf = (inf,inf) 
attempt2 = (inf,0) 
attempt_at_imag_inf = (0,inf) 

그래서 정말 문제 GNU g ++ V4.6.1은 C + +0을 지정하면 IT가하는 해답을 줄 이유는 무엇입니까? ORIGINAL POST

TO

개정이 난 그냥 옥타브 (MATLAB과 같은 수치 패키지)에 다음을 시도 :

A = INF + J의 * INF

그 대답은 다음과 같습니다

a = NaN + Infi

이것은 정확히 C++ 11 코드 (C++ 0x)에서 볼 수 있습니다. 나는 옥타브가 컴파일 된 것을 모른다 (C++과 FORTRAN의 조합이다). 그러나 그 패키지가 내가 얻는 결과를 반환한다면, 이것이 잘 알려진 행동이라고 가정한다.

그러나 C++ 11 초안 표준을 살펴본 결과이 동작에 대한 언급은 찾을 수 없습니다.

개정 3 ORIGINAL POST

다음 줄을 추가하는

my_complex_inf.real(my_complex_inf.imag()); 

단지 my_complex_inf의 건설이 C ​​++ 11 컴파일 "올바른"답 (INF, INF)을 반환하는 후. 불행히도, 이것은 이제 2 단계 프로세스이며 constexpr 함수에서 이런 종류의 복잡한 무한대를 만들 수 없습니다.

+4

제대로 작동합니다 [g ++ 4.3.4] (http://ideone.com/xfXDo), [g ++ 4.5.1] (http://ideone.com/FpmZK), 4.6.3 , 및 4.7.0. 짧고 완전한 샘플 프로그램을 제공해주십시오. http://sscce.org/를 참조하십시오. –

+1

복잡한 평면에서 가능한 무한대 4 가지를 원하십니까? 나는 당신이 오직 하나만 원한다고 생각할 것이다. (Riemann 영역과 같다). –

+1

글쎄, 당신은'1/std :: complex (0)'을 시도해 볼 수 있습니다. Riemann 구를 표현하려고한다면, 오직 '1/infty == 0' 만 원하기 때문입니다. –

답변

4

complex로 변환 된 스칼라 Inf는 inf + 0j입니다. 그렇습니다. 복잡한 평면에서의 스칼라 Inf offset은 회전을 의미하고 계산할 수 없기 때문에 Nan은 정확합니다. 다시 문제가 무엇입니까?

"용이있을 것입니다."

+0

a = 1, 즉 1 + 0 * j라고합시다. π/4의 회전은 1 * exp (j * pi/4), 즉 sqrt (2) + j * sqrt (2)이다. a가 inf 인 경우, b = inf * exp (j * pi/4). 이것은 실제 파트와 복잡한 파트의 inf의 곱셈을 포함하기 때문에, 결과는 또한 inf이어야합니다 (실제 파트와 복잡한 파트의 경우). 그래서 순환이 계산에서 나올 것이라고 생각하지 않습니다. 어떻게 구현되는지. –

4

C++ 11 (및 C11)이 복소수를 지정하고 혼동하는 방식으로 실행되고 있습니다.

기본적으로 스펙에서 위임 된 모델에는 단 하나의 무한대 ((inf, 0)로 표시)가 있으며, 복합체의 허수 부에 '무한대'를 넣으려고하면 Nan이됩니다. 그 모델에서 말이되지 않습니다.

0

메인 라인 (GCC-4.8) 내가 함께 얻을 -std = C++ 0X 기대 (NO -std) 답 : -std-C++ 11

my_complex_inf = (inf,inf) 
attempt2 = (inf,0) 
attempt_at_imag_inf = (0,inf) 

GCC-4.6.3

my_complex_inf = (-nan,inf) 
attempt2 = (inf,0) 
attempt_at_imag_inf = (-nan,inf) 

생성자가 해당 인수에 따라 실제 유형과 가상 유형을 설정해야한다고 생각합니다. nan이 없어야합니다.