-2

彼ら。浮動小数点演算を回避する作業を行っています。0.1 は、2 進浮動小数点形式で表される不正確です。だから私はこれを書き留めました

float i = 0.1f;

不正確な例外が発生することを期待しています。-fp-trap-all=all オプションをオンにし、fp-mode を strict に設定し、コードに SIGFPE シグナル ハンドラーをインストールしました。しかし、何も起こりませんでした。それから私は試しました

float i = 0.1f,j = 0.2f, c;
c = i + j;

まだ例外をキャッチできません! それは私を夢中にさせます。

申し訳ありませんが、私はついに Linux で Intel C++ コンパイラを使用しています。

4

2 に答える 2

1

自分で例外をテストする必要があります。次のコードは私のために働きます:

#include <stdio.h>
#include <fenv.h>

#ifndef FE_INEXACT
#  error No FP Exception handling!
#endif

int main()
{
    double a = 4.0;
    a /= 3.0;

    if (fetestexcept(FE_INEXACT) & FE_INEXACT)
    {
        printf("Exception occurred\n");
    }
    else
    {
        printf("No exception.\n");
    }
}

で置き換える4.03.0、例外は発生しません。

で同様のことができますdouble a = 0.0; a = sin(a);


例外のトラップは、条件付きでのみサポートされます。確認するには、ドキュメントに記載されているマクロを使用します。

#define _GNU_SOURCE
#include <fenv.h>

#ifndef FE_NOMASK_ENV
#  warning Cannot raise FP exceptions!
#else
#  warning Trapping FP exceptions enabled.
feenableexcept(FE_INEXACT);
#endif
于 2013-05-20T23:00:42.583 に答える
0

この答えによると、不正確な例外は、浮動小数点数の丸められたバージョンが数学的に正確な量と同じでない場合にのみ発生します。あなたの場合、丸められた応答は同じであるため、例外は発生しません。

于 2013-05-20T22:41:33.857 に答える