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 или который установит для этого точку останова.

Надеюсь это поможет

Другие вопросы по тегам