التعامل مع استثناء FPU على ويندوز
سؤال
أرغب في التعامل مع استثناء 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;
}
ولكن على ويندوز. حاولت قراءة MSDN، لكن المستند غير واضح على الإطلاق. أريد أن أفعل ذلك باستخدام محماسمات Visual Studio، على كل من Archs 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 وغيرها من الأشياء غير المحمولة :)
المحلول
يمكنك استخدام _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)
تعديل:
إذا كنت ترغب في القيام بذلك في عادي ج، فستحتاج إلى إلقاء نظرة على معالجة الاستثناء المنظم (سه).
يتم تكليف هذه الوظائف بالمعيار، لذلك يجب ألا تواجه مشكلة في التنقل. ما الخطأ الدقيق الذي تضربه؟