我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))
...