2012-02-21 3 views
5

을 사용하여 푸리에 변환 한 결과 인 std::complexNaN이 실제 또는 imag 부분에 포함되어 있는지 확인하려고합니다.복소수에 NaN이 있는지 검사

저는 볼랜드 C++을 사용하고 있으므로 std::isnan에 액세스 할 수 없습니다. 나는 수가 NaN 경우 자신과 비교하여 확인하는 것을 시도했다 :

(n.imag() != n.imag()) 

을하지만, 최대한 빨리이 n.imag() 또는 std::imag(n)을 부르는, 나는 "부동 소수점 잘못된 작업"을 얻는다.

std::complex이 좋은지 검증 할 방법이 있습니까? NaN이 포함되어 있으면

+5

'std :: isnan'을 지원하지 않으면 컴파일러를 변경하십시오. – Nawaz

+0

Nawaz : 그것에 착수하십시오. 그러나 그것은 큰 코드 기반이며 나는 그 제품을 유지해야합니다. – dagur

답변

0

볼랜드는 자체 수학 라이브러리가 있다는 것을 알았습니다. 따라서 부동 소수점 오류를 피하려면 Borland Math에서 IsNan을 사용하십시오. 전달 된 값은 NaN이 경우 float.h 헤더

int _isnan(double d); 

가입일

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/[email protected]

+0

을 사용합니다. 복잡한 숫자의 NaN을 확인하려면 Borland에서이 해킹을 수행해야했습니다. std :: 복합체 ; double a (n._Val [0]); 이중 b (n.Val [1]); IsNan (a) || IsNan (b), IsNan은 Math.hpp에 정의되어 있습니다. – dagur

4

이것은 ++ g 작동 :

#include<iostream> 
#include<cmath> 
#include<complex> 

int main(){ 

    double x=sqrt(-1.); 
    std::complex<double> c(sqrt(-1.), 2.); 

    std::cout<<x<<"\n"; 
    std::cout<<c<<"\n"; 

    std::cout<< ((c!=c) ? "yup" : "nope")<<"\n"; 
} 
+0

편집 : 이것은 작동합니다. 나는 이것을 시도해 보았고 출력은 다음과 같다. + NAN (+ NAN, 2) nope – dagur

+0

@dagur : 그래서 작동했다 --- NaN 인 복소수에 대해서는 'yup'이라고했다. 내가 놓친 게 있니? –

+0

예, 저의 반응을 편집 할 때 느려졌습니다. :). – dagur

0

math.h에서 fpclassify() 있습니까? NaN의 경우 FP_NAN을 반환해야합니다. 또는 isnan()을 사용하는 것이 더 좋습니다. 그러한 함수/매크로가없는 경우, 부동 소수점 또는 복식의 2 진 표현을보고 NaN을 수동으로 확인할 수 있습니다. 자세한 내용은 IEEE-754 단정도 및 배정도 형식을 참조하십시오.

+0

fpclassify()가 std에 존재하지 않는 것 같습니다. C++에서는 – dagur

1

nonzero 값 (TRUE)를 반환 그렇지 않으면 0 (FALSE)을 반환합니다.

int _fpclass(double __d); 

인수의 부동 소수점 클래스를 나타내는 정수 값을 반환합니다. 가능한 값은 FLOAT.H (NaN, INF 등)에 정의되어 있습니다.

관련 문제