Обработка исключения fpu в Windows
Вопрос
Я хотел бы обработать исключение fpu в Windows, что-то вроде:
#include <math.h>
#include <fenv.h>
#include <stdio.h>
int main()
{
double b = 0;
int raised;
feclearexcept (FE_ALL_EXCEPT);
b /= 0;
raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
if (raised & FE_OVERFLOW) { printf("over\n");}
if (raised & FE_INVALID) { printf("invalid\n");}
return 0;
}
Но в Windows.Я попытался прочитать MSDN, но документ совсем непонятен.Я хочу сделать это с помощью компиляторов Visual Studio, как на x86, так и на amd64 archs.
Я не заинтересован в переводе исключения на C ++ - на самом деле, меня даже не интересует исключение FPU, только знание состояния FPU после некоторых вычислений, как в примере выше.
== редактировать ==
Хорошо, похоже, что на самом деле все намного проще:достаточно использовать _clearfp:
#include <math.h>
#include <float.h>
#include <stdio.h>
int main()
{
double b = 0;
int raised;
raised = _clearfp();
b /= 0;
raised = _clearfp();
if (raised & SW_INVALID) { printf("invalid\n");}
return 0;
}
Намного лучше, чем иметь дело с исключениями, SEH и прочим непереносимым хламом :)
Решение
Вы можете использовать _statusfp2() для получения статуса с плавающей запятой.Имейте в виду, что 32-разрядная версия использует как инструкции FPU, так и SSE.Несколько примеров кода:
#include "stdafx.h"
#include <float.h>
#include <math.h>
#include <assert.h>
int _tmain(int argc, _TCHAR* argv[])
{
unsigned x86;
unsigned sse;
// Test zero-divide
double d = 0;
double v = 1 / d;
_statusfp2(&x86, &sse);
assert(x86 & _EM_ZERODIVIDE);
// Test overflow
v = pow(10, 310.0);
_statusfp2(&x86, &sse);
assert(sse & _EM_OVERFLOW);
return 0;
}
Другие советы
Если это Visual Studio, попробуйте ввести эту строку:
#pragma float_control (except, on)
Подробнее об этом здесь и здесь.
Редактировать:
Если вы хотите сделать это на обычном C, вам нужно будет взглянуть на структурированная обработка исключений (SEH).
Эти функции предусмотрены стандартом, поэтому у вас не должно возникнуть проблем с переносом.С какой именно ошибкой вы столкнулись?