std :: signaling_nan을 사용하는 방법?
-
04-07-2019 - |
문제
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;
}