문제

SO에서 또 다른 질문을 본 후C ++에서 NAN 사용) 나는 궁금해졌다 std::numeric_limits<double>::signaling_NaN().

나는 신호 _nan이 예외를 던지게 할 수 없었다. 나는 아마도 신호를 의미하는 신호를 의미한다고 생각했기 때문에 Sigfpe를 잡으려고했지만 아니 ...

내 코드는 다음과 같습니다.

double my_nan = numeric_limits<double>::signaling_NaN();
my_nan++;
my_nan += 5;
my_nan = my_nan / 10;
my_nan = 15 / my_nan;
cout << my_nan << endl;

numeric_limits<double>::has_signaling_NaN TRUE로 평가하므로 내 시스템에서 구현됩니다.

어떤 아이디어?

MS Visual Studio .NET 2003의 C ++ 컴파일러를 사용하고 있습니다. 집에 도착하면 다른 것을 테스트하고 싶습니다.

감사!

도움이 되었습니까?

해결책

당신은 사용할 수 있습니다 _control87() 부동 소수점 예외를 활성화하는 기능. MSDN 문서에서 _control87():

메모:

런타임 라이브러리는 기본적으로 모든 부동 소수점 예외를 마스킹합니다.

플로팅 포인트 예외가 활성화되면 사용할 수 있습니다. signal() 또는 SEH (구조 예외 처리) 그들을 잡기 위해.

다른 팁

경고 한 말 : 제 3 자 DLL을 사용하면 이러한 예외를 조용히 활성화 할 수 있습니다. 이것은 DLL을 기본적으로 가능하게하는 언어로 작성된 DLL을로드하는 데 특히 그렇습니다.

두 가지 인스턴스에서 이런 일이 발생했습니다. 임베디드 브라우저 컨트롤에서 HP 프린터로 인쇄하고 Delphi로 작성된 Innosetup에서 DLL을 등록합니다.

열쇠는 numeric_limits<T>::has_signaling_NaN. 이것은 당신에게 어떤 가치가 있습니까? (MSDN은 항상 false MSVC를 위해?)

에서 TFM:

cout << "The signaling NaN for type float is:  "
    << numeric_limits<float>::signaling_NaN( )
    << endl;

->

유형 플로트에 대한 신호 NAN은 다음과 같습니다. 1.#QNAN

'Q'는 '조용한'을 나타냅니다. Dunno가 왜 그것을 돌려 주는지, 그러나 그것이 당신에게 예외를 던지지 않는 이유입니다.

호기심으로 인해 이것이 더 잘 작동합니까?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top