3

私はC99 でfetestexcept()を使用していますが、float を乗算すると不正確な結果が得られると不平を言うことがあります ( FE_INEXACT )。float 変数に float リテラルを乗算すると発生するようです。fetestexcept() が文句を言わないように、これをどのように変更できますか?

gcc -std=c99 -lm test.c

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

#pragma STDC FENV_ACCESS ON

int main(void)
{
    float a = 1.1f;
    float b = 1.2f;
    float c = a * b * 1.3f;

    int exception = fetestexcept(FE_ALL_EXCEPT);
    if(exception != 0)
    {
        printf("Exception: 0x%x\n", exception); // 0x20 FE_INEXACT
    }

    return 0;
}
4

2 に答える 2

5

その例外に興味がなければ、FE_INEXACT をテストしないでください。たとえば、代わりに


int exception = fetestexcept(FE_ALL_EXCEPT);

行う


int exception = fetestexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
于 2012-10-10T11:43:37.327 に答える
1

Diagnostic- Pragmasを使用して、証明書の警告を無視できます。

たとえば、コードのサブセットをコンパイルする場合は、次のようになります。

#include <stdio.h>
#include <math.h> 
#include <fenv.h>  
#pragma STDC FENV_ACCESS ON  
int main(void) {
   float a = 1.1f;
   float b = 1.2f;
   float c = a * b * 1.3f;
   int exception = c;
   return 0;
 } 

と:

gcc -Wall test.c

次のような警告が表示されます。

test.c:22:0: warning: ignoring #pragma STDC FENV_ACCESS [-Wunknown-pragmas]
test.c: In function ‘main’:
test.c:28:11: warning: unused variable ‘exception’ [-Wunused-variable]

次に、それらを無音にするために、「無視された」プラグマを追加できます。

#pragma GCC diagnostic ignored "-Wunknown-pragmas"
#pragma GCC diagnostic ignored "-Wunused-variable"

再コンパイルすると、警告が消えます。

于 2012-10-10T11:49:26.443 に答える