Обнаружение потенциальных состояний 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, одна из которых имеет тестовую программу, которая демонстрирует проблему.

Другие вопросы по тегам