Visual Studio C++ 2008 / 2010 - перерыв на плаву NaN
Есть ли какой-нибудь способ настроить Visual Studio (только что обновленный с 2008 по 2010 год) для разрыва, как если бы утверждение не выполнялось, когда любое число с плавающей запятой становится NaN, QNAN, INF и т. Д.?
До сих пор я только что использовал трюк assert(x == x), но я бы предпочел что-то неявное, чтобы мне не приходилось добавлять утверждения везде.
Я очень удивлен, что не могу найти ответ на этот вопрос через Google. Некоторые вещи о "исключениях с плавающей запятой", но я не уверен, что это одно и то же, и я попытался включить их в Visual Studio, но программа не работает, пока что-то катастрофическое не произойдет из-за NaN позже в исполнении.
4 ответа
1) Перейдите в опцию проекта и включите / fp: strict (C / C++ -> Генерация кода -> Модель с плавающей точкой).
2) Используйте _controlfp, чтобы установить управляющее слово с плавающей точкой (см. Код ниже).
#include <float.h>
unsigned int fp_control_state = _controlfp(_EM_INEXACT, _MCW_EM);
#include <math.h>
int main () {
sqrtf(-1.0); // floating point exception
double x = 0.0;
double y = 1.0/x; // floating point exception
return 0;
}
По крайней мере, на x86, когда вы генерируете NaN и т. Д., Устанавливается один из битов регистра состояния FPU. Есть способ, которым вы можете установить, чтобы он генерировал исключение H/W при следующей последующей операции FP, но это не совсем так, как вы ожидали. Я не могу вспомнить ссылку, хотя.
Я не уверен, возможно ли это так, как вы этого хотите, но вы можете создать макрос, который обернет код в отмеченной строке в assert или который установит для этого точку останова.
Надеюсь это поможет