5

EXCEPTION_FLT_UNDERFLOW をスローするサンプル コードが必要です。その例外を処理するコードが既にあります。今、私はそれをスローするサンプルが必要です。何かアドバイスはありますか?

4

4 に答える 4

4

これをトリガーする実際のコードが必要だと仮定します。

#include <float.h>

int main()
{
    _controlfp_s(NULL, 0, _MCW_EM); // enable all floating point exceptions

    float f= 1.0f;

    while (f)
    {
        f/=2.0f;
        // __asm fwait; // optional, if you want to trap the underflow sooner
    }

    return 0;
}
于 2010-10-11T22:04:16.030 に答える
2

試す:

RaiseException(EXCEPTION_FLT_UNDERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
于 2010-10-11T18:19:49.113 に答える
1

C99 でさえ、これを行う移植可能な方法はありません。これは Linux で動作します:

#define _GNU_SOURCE
#include <fenv.h>
int
main(void)
{
  fesetenv(FE_NOMASK_ENV);
  feraiseexcept(FE_UNDERFLOW);
  return 0;
} 

ただし、#define _GNU_SOURCEと のfesetenv呼び出し (移植性がない) がなければ、例外はスローされず(Unix 用語では == はトリガーSIGFPEされません)、フラグを設定するだけです。また、MSVC の反復は をサポートしていない<fenv.h>ため、Windows では完全に非標準のままです。

そうは言っても、Windows固有の同等のものがあるようです:

#include <float.h>
#pragma fenv_access (on)
int
main(void)
{
  _controlfp_s(0, 0, _MCW_EM); /* throw all floating point exceptions */
  /* trigger floating-point underflow here */
}

実際の浮動小数点演算を使用してアンダーフロー状態を発生させる必要があります。私は頭の上からそれを行う方法がわかりません。コンパイラからの干渉を避けるために、アセンブリ言語で手動で行うのがおそらく最善でしょう(移植性はさらに低くなりますが、Windowsを使用している場合は、おそらくx86以外のCPUは気にしません)。

于 2010-10-11T18:39:47.860 に答える
-2

EXCEPTION_FLT_UNDERFLOW をスローします。

于 2010-10-11T18:32:27.117 に答える