Обнаружение потенциальных состояний FPU, вызванных одним оператором
Я использую fenv
искать операторы, которые приводят к переполнению, потере, неточным результатам и т. д.
Тем не менее, я прав, предполагая, что компилятор может изменить порядок кода на меня и не реализовать эффект, который я на самом деле желаю? Если так, то как бы мне создать "барьер" вокругfe*
функции (бонусные баллы за стандартизированные способы сделать это?) Могу ли я простопоместить куда-нибудь энергозависимый блок?
Я бы просто проверил это, если бы мог, но я не уверен, как.
Пример:
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 */
РЕДАКТИРОВАТЬ:
А пока я использую энергозависимые блоки, чтобы создать барьер.
feclearexcept(FE_ALL_EXCEPT);
__asm__ volatile(
"flds %2\n\t"
"faddp\n\t"
: "=&t" (result)
: "f" (src1),
"m" (src2)
);
if (fetestexcept(FE_ALL_EXCEPT))
...
1 ответ
Интересная проблема! Я нашел эту страницу, обсуждающую тему, и там написано, что добавление
#pragma STDC FENV_ACCESS ON
будет делать то же самое на компиляторе, совместимом с C99... который не включает gcc. Вы, кажется, правы с изменчивым обходным решением, все же.
Эта страница указывает на пару ошибок gcc, одна из которых имеет тестовую программу, которая демонстрирует проблему.