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 함수에서 이런 종류의 복잡한 무한대를 만들 수 없습니다.
제대로 작동합니다 [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/를 참조하십시오. –
복잡한 평면에서 가능한 무한대 4 가지를 원하십니까? 나는 당신이 오직 하나만 원한다고 생각할 것이다. (Riemann 영역과 같다). –
글쎄, 당신은'1/std :: complex (0)'을 시도해 볼 수 있습니다. Riemann 구를 표현하려고한다면, 오직 '1/infty == 0' 만 원하기 때문입니다. –