Почти любая операция с плавающей точкой или математическая библиотечная функция, которая генерирует NaN из не-NaN-входов, также должны сигнализировать об исключении с плавающей точкой «недопустимая операция»; аналогично, вычисление, которое производит бесконечность из конечных входных данных, обычно сигнализирует об исключении с плавающей точкой «деление на ноль» или «переполнение». Таким образом, вы хотите каким-то образом превратить эти исключения в SIGFPE.
Я подозреваю, что ответ будет сильно зависеть от системы, поскольку управление ловушками и флагами с плавающей точкой, скорее всего, будет предоставлено библиотекой платформы C, а не самим gcc. Но вот пример, который работает для меня, на Linux. Используется функция feenableexcept
из fenv.h
. Определение _GNU_SOURCE
необходимо для объявления этой функции.
#define _GNU_SOURCE
#include <fenv.h>
int main(void) {
double x, y, z;
feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
x = 1e300;
y = 1e300;
z = x * y; /* should cause an FPE */
return 0;
}
Предостережение: я думаю, что с некоторыми установками возможно, что исключение фактически не генерируется до тех пор, пока следующая операция с плавающей запятой после той, которая (в теории) должна была вызвать ее, поэтому иногда нужна операция с плавающей точкой без операции (например, умножение на 1,0), чтобы вызвать исключение.