سؤال

أرغب في التعامل مع استثناء 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)

المزيد عن هذا هنا و هنا.

تعديل:

إذا كنت ترغب في القيام بذلك في عادي ج، فستحتاج إلى إلقاء نظرة على معالجة الاستثناء المنظم (سه).

يتم تكليف هذه الوظائف بالمعيار، لذلك يجب ألا تواجه مشكلة في التنقل. ما الخطأ الدقيق الذي تضربه؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top