Обработка FPU исключение на окнах


2

Я хотел бы обрабатывать исключения FPU на окнах, что-то вроде:

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

Но на окнах. Я пробовал читать MSDN, но документ не совсем понятен. Я хочу сделать это с помощью компиляторов Visual Studio, как на архитектуре x86, так и на amd64.

Мне не интересно переводить исключение в 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 и других не портативный материал:)

  0

Работает в G ++ под Windows, кажется, является ошибкой компилятора. 22 фев. 092009-02-22 13:02:48

  0

Да, обработка «на окнах» неточна: я имел в виду Visual Studio. 22 фев. 092009-02-22 13:37:38

2

Вы можете использовать _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; 
} 
  0

спасибо, это именно то, что я искал. 22 фев. 092009-02-22 16:06:46


0

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

  0

Он даже не компилируется - AFAIK, компиляторы MS не имеют fenv.h, но имеют свой собственный механизм. 22 фев. 092009-02-22 13:47:31

  0

Для VS вам придется полагаться на упомянутую прагма-арул. 22 фев. 092009-02-22 14:06:22


2

Если это Visual Studio, попытайтесь поместить в этой строке:

#pragma float_control (except, on) 

Подробнее об этом here и here.

EDIT:

Если вы хотите сделать это в простом C, вам нужно взглянуть на structured exception handling (SEH).

  0

Две ссылки крайне неясны, к сожалению; Я не понимаю, что должен делать float_control: перевести ошибку в исключение C++? Я хотел бы получить чистое решение C. 22 фев. 092009-02-22 13:56:56