Вопрос

Я хотел бы обработать исключение 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).

Эти функции предусмотрены стандартом, поэтому у вас не должно возникнуть проблем с переносом.С какой именно ошибкой вы столкнулись?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top