我们采取以下计划:
#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
例外,对具有相同环境的fegetenv
或fesetenv
的调用不应该修改它。
这在i386-linux上按预期工作,但在x86_64-linux(在64位模式下),我得到“0 1 0 1”。也就是说,对fegetenv
的调用会清除例外掩码。
我没有看到任何记录,甚至在C99下允许的行为。我可以在glibc-2.5和glib-2.13下确认。
有人可以在最近的glibc上测试吗? 我认为这是一个错误吗?