Ste*_*ach 7 c floating-point gcc floating-point-exceptions
我遇到了浮点比较的问题.使用<运算符将值与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;
}
Run Code Online (Sandbox Code Playgroud)
在我的机器(Linux,march=broadwell)上,它返回"Not invalid".我使用GCC v7.2.0编译它,使用-std=c11选项(不使用它没有改变结果中的任何内容).发出的x86指令UCOMISS只会引发信号NaN的异常 - 我希望看到COMISS这会引发所有NaN比较的异常,因为NaN无论是否发信号都是无序的.
我是否在代码中出错或忘记了一些编译器选项以使行为符合IEEE标准?可能是编译器中的错误(或性能优化)忽略了在此处引发异常的需要吗?
好的,所以我冒险尝试运行最新的 GCC 版本 (8.2)。
在GCC 8.2.0下编译时,代码的行为符合预期,因此我假设问题是编译器错误。我没有尝试 7.2.0 和 8.2 之间的其他版本来查看它从什么时候开始工作,但使用 8.2 对我来说已经足够了。