Как повысить исключение с плавающей точкой

Ребята. Я делаю некоторую работу вокруг операций с плавающей точкой. 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

Согласно этому ответу, неточное исключение возникает только в том случае, если округленная версия числа с плавающей запятой не совпадает с математически точной суммой. В вашем случае округленный ответ такой же, поэтому исключений не возникало.

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