gpt4 book ai didi

c - 浮点异常 - gcc 错误?

转载 作者:太空狗 更新时间:2023-10-29 15:18:29 26 4
gpt4 key购买 nike

考虑以下代码:

#include <fenv.h>
#include <stdio.h>
int main()
{
#pragma STDC FENV_ACCESS ON
1.0/0.0;
printf("%x\n", fetestexcept(FE_ALL_EXCEPT));
}

我希望它打印一个对应于 FE_DIVBYZERO 的非零值,但它打印了 0。将 main 的第二行更改为 double x = 1.0/0.0; 给出了预期的行为。这是允许的,还是一个错误?

编辑:就其值(value)而言,乍一看,在大多数现实世界的代码中,可能导致引发 fenv 异常的操作无法优化,因此可以安全地执行大量计算并在最后检查是否发生溢出、被零除等。然而,当您考虑内联和优化时,事情变得一团糟,真正的问题出现了。如果这样的函数在由于常量参数而总是被零除的情况下被内联,gcc 可能会变得非常聪明并优化整个内联函数以return INFINITY; 不引发任何异常。

最佳答案

这是预期的行为。 gcc 不对表达式求值,因为它之后与它无关。

如果您使用“-Wall”进行编译,它会警告您该语句无效,并且会忽略 pragma 语句。

GCC 不完全符合 C99。有关详细信息,请参阅: http://gcc.gnu.org/c99status.html

有关实现此行为的问题,请参阅:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20785

关于c - 浮点异常 - gcc 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6336786/

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