2008-10-25 2 views
7

Посмотрев еще один вопрос на SO (Using NaN in C++) Мне стало интересно о std::numeric_limits<double>::signaling_NaN().Как использовать std :: signaling_nan?

Я не мог получить signaling_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 истинно, так что реализуется в моей системе.

Любые идеи?

Я использую ms visual studio .net 2003 компилятор C++. Я хочу проверить его на другом, когда вернусь домой.

Спасибо!

+0

Предполагаю, что my_nan и num должны быть одной и той же переменной. Если да, исправьте это. – Motti 2008-11-01 21:09:24

ответ

5

Вы можете использовать функцию _control87() для включения исключений с плавающей запятой. Из документации MSDN по _control87():

Примечание:

время выполнения библиотек маскировать все исключения с плавающей точкой по умолчанию.

Если включены исключения с плавающей запятой, вы можете использовать signal() или SEH (Structured Exception Handling), чтобы поймать их.

0

От 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; 
} 
5

Предупреждение: Использование сторонних DLL может безболезненно разрешать эти исключения. Это особенно верно для загрузки DLL, написанных на языке, который позволяет им по умолчанию.

У меня это произошло в двух экземплярах: печать с встроенного браузера на принтер HP и регистрация моей DLL (которая устанавливает некоторые начальные значения NaN) из InnoSetup, которая написана в Delphi.

+1

Я знаю противоположный случай, когда вызов внешней DLL отключает их. Поэтому с этого момента все исключения FPU маскируются. Поэтому я не знаю никаких потенциальных ошибок в программе. Такие плохо написанные вещи - позор. Все сторонние DLL должны возвращать маски исключений с плавающей запятой в предыдущие значения. – truthseeker 2012-08-01 10:01:15

Смежные вопросы