我在C99中使用fetestexcept(),它有时会抱怨乘法浮点数会产生不精确的结果(FE_INEXACT)。当浮点变量乘以浮点文字时似乎会发生这种情况。我怎么能修改这个,所以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;
}
答案 0 :(得分:5)
那么,如果您对该异常不感兴趣,请不要测试FE_INEXACT?例如。而不是
int exception = fetestexcept(FE_ALL_EXCEPT);
DO
int exception = fetestexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
答案 1 :(得分:1)
您可以使用Diagnostic-Pragmas忽略certian警告。
例如,如果我要编译代码的一个子集:
#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:
#pragma GCC diagnostic ignored "-Wunknown-pragmas"
#pragma GCC diagnostic ignored "-Wunused-variable"
重新编译并且警告消失。