Как повысить исключение с плавающей точкой
Ребята. Я делаю некоторую работу вокруг операций с плавающей точкой. 0.1 неточно представлен двоичным форматом с плавающей точкой. Таким образом, я записал это
float i = 0.1f;
и ожидание возникновения неточного исключения. Я включил опцию -fp-trap-all = all, установил строгий режим fp и установил обработчик сигнала SIGFPE в своем коде. Но ничего не случилось. Потом я попробовал
float i = 0.1f,j = 0.2f, c;
c = i + j;
до сих пор не могу поймать любые исключения! Это сводит меня с ума.
Извините, что наконец-то использую компилятор intel C++ для Linux.
2 ответа
Вы должны проверить на исключения самостоятельно. У меня работает следующий код:
#include <stdio.h>
#include <fenv.h>
#ifndef FE_INEXACT
# error No FP Exception handling!
#endif
int main()
{
double a = 4.0;
a /= 3.0;
if (fetestexcept(FE_INEXACT) & FE_INEXACT)
{
printf("Exception occurred\n");
}
else
{
printf("No exception.\n");
}
}
Если вы замените 4.0
от 3.0
Вы не получите исключение.
Вы можете сделать что-то подобное с double a = 0.0; a = sin(a);
,
Исключения захвата поддерживаются только условно. Для проверки используйте макросы, описанные в документации:
#define _GNU_SOURCE
#include <fenv.h>
#ifndef FE_NOMASK_ENV
# warning Cannot raise FP exceptions!
#else
# warning Trapping FP exceptions enabled.
feenableexcept(FE_INEXACT);
#endif
Согласно этому ответу, неточное исключение возникает только в том случае, если округленная версия числа с плавающей запятой не совпадает с математически точной суммой. В вашем случае округленный ответ такой же, поэтому исключений не возникало.