fegetenv()清除x86_64-linux上的异常掩码

时间:2013-11-20 22:37:17

标签: floating-point c99 glibc floating-point-exceptions fenv

我们采取以下计划:

#include <stdio.h>
#include <fenv.h>

int main (void)
{
  fenv_t e;

  printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
  feenableexcept (FE_INVALID);
  printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
  fegetenv (&e);
  printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
  fesetenv (&e);
  printf ("%d\n", fegetexcept () & FE_INVALID ? 1 : 0);
}

我希望它输出“0 1 1 1”:即,一旦我启用了FE_INVALID例外,对具有相同环境的fegetenvfesetenv的调用不应该修改它。

这在i386-linux上按预期工作,但在x86_64-linux(在64位模式下),我得到“0 1 0 1”。也就是说,fegetenv的调用会清除例外掩码

我没有看到任何记录,甚至在C99下允许的行为。我可以在glibc-2.5和glib-2.13下确认。

有人可以在最近的glibc上测试吗? 我认为这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

好吧,我在glibc bug数据库中filed a bug,已被其中一位开发人员证实。我想这足以证明确实是glibc中的错误