floatex.dll の関数の多くは、実際の処理を行う前に例外をチェックし、未処理の例外がある場合は先にその例外を処理します。そのため、例外ハンドラ内で例外フラグをクリアしないまま floatex.dll の関数を実行すると異常動作に繋がります。
テスト.
#include <stdio.h>
#include "floatex.h"
void __cdecl main(void)
{
floatex_loadcw(FEX_PC_64 | FEX_RC_NEAR);
__try{
FLOATEX t;
floatex_snan(0,t);
floatex_add(t,t); /* 例外発生 → except ブロックへ */
}
__except(1){
printf("%d\n",floatex_isempty());
floatex_stinit(0);
printf("%d\n",floatex_isempty());
floatex_fwait();
}
}
上記のプログラムでは、ハンドラ内でフラグがクリアされていないので、floatex_fwait で例外処理が行われてしまいます(floatex_fwait に限らず、演算関数等でも例外が発生します)。
floatex_fwait が実行される前にフラグをクリアすれば、例外処理が行われる事はありません。上記の場合は floatex_stinit の引数を 1 にする事でもクリアは行われます。
・
・
・
__except(1){
printf("%d\n",floatex_isempty());
floatex_stinit(0); ← この引数を 1 にするか、floatex_clear87 等で
フラグをクリアする
printf("%d\n",floatex_isempty());
floatex_fwait(); ← ここに到達する前に例外フラグをクリアする必要がある
}