Visual Studio C ++ 2008/2010 - перерыв на плаву NaN - PullRequest
27 голосов
/ 15 декабря 2010

Есть ли какой-нибудь способ настроить Visual Studio (только что обновленный с 2008 по 2010 гг.) Для разрыва, как если бы утверждение не удалось, всякий раз, когда любое число с плавающей точкой становится NaN, QNAN, INF и т. Д.? 1003 *

До сих пор я только что использовал трюк assert (x == x), но я бы предпочел что-то неявное, чтобы мне не приходилось добавлять утверждения везде.

Очень удивлен, я не могу найти ответ на этот вопрос через Google. Некоторые вещи о «исключениях с плавающей запятой», но я не уверен, что это одно и то же, и я попытался включить их в Visual Studio, но программа не работает, пока что-то катастрофическое не произойдет из-за NaN позже в исполнении.

Ответы [ 4 ]

31 голосов
/ 16 декабря 2010

1) Перейдите к параметру проекта и включите / fp: строгий (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;
}
4 голосов
/ 15 декабря 2010
1 голос
/ 15 декабря 2010

По крайней мере, на x86, когда вы генерируете NaN и т. Д., Устанавливается один из битов регистра состояния FPU. Есть способ, которым вы можете установить, чтобы он генерировал исключение H / W для следующей следующей операции FP, но это не совсем так, как вы ожидали. Я не могу вспомнить ссылку, хотя.

0 голосов
/ 15 декабря 2010

Я не уверен, возможно ли это так, как вы этого хотите, но вы можете создать макрос, который обернет код в отмеченной строке в assert или который установит для этого точку останова.

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

...