3

fenv用来查找产生溢出、下溢、不精确结果等的语句。

但是,我是否正确假设编译器可以对我的代码重新排序而不实现我真正想要的效果?如果是这样,我将如何在fe*函数周围创建一个“障碍”(这样做的标准化方法的奖励积分?)我可以在某个地方放置一个volatile块吗?

如果可以的话,我会测试这个,但我不确定如何。

例子:

void some_function(double d) {
float f;

feclearexcept(FE_ALL_EXCEPT)
f = d; /* will the relevant code for this statement be inserted exactly here? */
if (fegetexcept(FE_ALL_EXCEPT))
    printf("FP condition raised during conversion from double to float.\n");
}

/* desired behaviour: */
some_function(DBL_MAX); /* should cause printf to execute */
some_function(FLT_MAX); /* should not cause printf to execute */

编辑:

同时,我使用 volatile 块实际上是创建一个屏障。

feclearexcept(FE_ALL_EXCEPT);

__asm__ volatile(
  "flds %2\n\t"
  "faddp\n\t"
  : "=&t" (result)
  : "f" (src1),
    "m" (src2)
);

if (fetestexcept(FE_ALL_EXCEPT))
  ...
4

1 回答 1

1

有趣的问题!我发现这个页面讨论了这个话题,它说添加

#pragma STDC FENV_ACCESS ON

将在符合 C99 的编译器上做正确的事情……不包括 gcc。不过,您似乎对 volatile 变通办法是正确的。

该页面指向几个 gcc 错误,其中一个有一个演示该问题的测试程序。

于 2013-04-01T00:36:20.843 回答