C:无序浮点比较不会引发FE_INVALID



我遇到了浮点比较的问题。当使用<运算符将值与NaN进行比较时,我希望设置FE_INVALID标志。<操作员应根据C11标准(以及IEEE-754):升起标志

isless宏确定其第一个参数是否小于第二个论点。isless(x, y)的值始终等于(x) < (y);但是,(x) < (y)不同,isless(x, y)xy无序

下面是一个重现我的问题的示例程序:

#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_INVALIDn");
else
printf("Not invalidn");
return 0;
}

在我的机器(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对我来说已经足够了

相关内容

  • 没有找到相关文章

最新更新