【发布时间】:2013-12-05 04:36:21
【问题描述】:
让我们来看看下面的程序:
#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 上测试它吗? 我认为这是一个错误是否正确?
【问题讨论】:
标签: floating-point c99 glibc floating-point-exceptions fenv