Ответ 1
Почти любая операция с плавающей запятой или функция математической библиотеки, которая генерирует NaN из не-NaN-входов, также должна сигнализировать исключение с плавающей запятой "недействительная операция"; Аналогично, расчет, который создает бесконечность с конечных входов, обычно сигнализирует об исключении с плавающей запятой "divide-by-zero" или "overflow". Поэтому вы хотите каким-то образом превратить эти исключения в 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;
}
Оговорка. Я думаю, что с некоторыми настройками можно предположить, что исключение фактически не генерируется до следующей операции с плавающей запятой после той, которая (теоретически) должна была вызвать ее, поэтому вам иногда требуется no-op floating (например, умножение на 1.0) для запуска исключения.