gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:13:09 24 4
gpt4 key购买 nike

我遇到了 float 比较的问题。使用 < 将值与 NaN 进行比较时接线员,我希望 FE_INVALID要设置的标志。 <运营商应该根据 C11 标准(也根据 IEEE-754)升旗:

The isless macro determines whether its first argument is less than its second argument. The value of isless(x, y) is always equal to (x) < (y); however, unlike (x) < (y), isless(x, y) does not raise the "invalid" floating-point exception when x and y are unordered.

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

#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)它返回“无效”。我使用 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 对我来说已经足够好了。

关于C: 无序浮点比较不会引发 FE_INVALID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54571977/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com