Подтвердить что ты не робот

Visual Studio С++ 2008/2010 - перерыв на float NaN

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

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

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

4b9b3361

Ответ 1

1) Перейдите к опции проекта и включите /fp: strict (C/С++ → Генерация кода → Плавающая модель Pint).

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;
}

Ответ 3

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

Ответ 4

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

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