EXCEPTION_FLT_UNDERFLOW をスローするサンプル コードが必要です。その例外を処理するコードが既にあります。今、私はそれをスローするサンプルが必要です。何かアドバイスはありますか?
1265 次
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 に答える