我遇到了浮点比较的问题。使用<
运算符将值与 NaN 进行比较时,我希望FE_INVALID
设置该标志。操作员应根据<
C11 标准(也根据 IEEE-754)升旗:
宏确定它的
isless
第一个参数是否小于它的第二个参数。的值isless(x, y)
始终等于(x) < (y)
; 但是,与 不同(x) < (y)
的是 ,当和无序isless(x, y)
时不会 引发“无效”浮点异常。x
y
这是一个重现我的问题的示例程序:
#include <stdio.h>
#include <math.h>
#include <fenv.h>
#pragma STDC FENV_ACCESS ON
int main()
{
volatile float a = 12.0f;
volatile float b = NAN;
volatile int c;
feclearexcept(FE_ALL_EXCEPT);
c = (a < b);
if (fetestexcept(FE_INVALID))
printf("FE_INVALID\n");
else
printf("Not invalid\n");
return 0;
}
在我的机器(Linux,march=broadwell
)上,它返回“Not invalid”。我使用 GCC v7.2.0 编译它,使用-std=c11
选项(不使用它并没有改变结果中的任何内容)。发出的 x86 指令UCOMISS
仅引发信号 NaN 的异常 - 我希望看到COMISS
这会引发所有 NaN 比较的异常,因为无论它们是否发出信号,NaN 都是无序的。
我是否在代码中犯了错误或忘记了一些编译器选项以使行为符合 IEEE 标准?忽略此处引发异常的需要可能是编译器中的错误(或性能优化)吗?