1

Windowsで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 を読んでみましたが、ドキュメントがまったくわかりません。x86 と amd64 の両方のアーキテクチャで、Visual Studio コンパイラでこれを行いたいと考えています。

私は 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、およびその他の移植性のないものを処理するよりもはるかに優れています:)

4

3 に答える 3

2

Visual Studio の場合は、次の行を追加してみてください。

#pragma   float_control (except, on)

詳細については、こちらこちらをご覧ください。

編集:

単純な C でこれを行いたい場合は、構造化例外処理 ( SEH ) を確認する必要があります。

于 2009-02-22T13:07:09.010 に答える
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;
}
于 2009-02-22T15:38:24.557 に答える
0

これらの機能は標準で義務付けられているため、移植に問題はありません。どのような正確なエラーが発生していますか?

于 2009-02-22T12:58:24.803 に答える