質問

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

しかし、Windowsで。 MSDNを読んでみましたが、ドキュメントはまったく明確ではありません。 X86とAMD64アーチの両方で、Visual Studioコンパイラでこれをやりたいと思っています。

私はC ++で例外を翻訳することに興味がありません - 実際、私はFPUの例外にさえ興味がありません。上記の例のように、いくつかの計算の後にFPU状態を知ることにのみです。

== edit ==

わかりました、それは実際にははるかに単純であるように見えます:_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;
}

他のヒント

ビジュアルスタジオの場合は、このラインに入れてみてください。

#pragma   float_control (except, on)

これについてもっと ここここ.

編集:

プレーンCでこれを行いたい場合は、 構造化された例外処理(seh).

これらの機能は標準によって義務付けられているため、移植に問題はないはずです。どのような正確なエラーを打っていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top