Деление на ноль не выбрасывает SIGFPE
У меня есть небольшая программа, выполняющая деление с плавающей запятой на ноль, поэтому я ожидаю SIGFPE.
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
void signal_handler (int signo) {
if(signo == SIGFPE) {
std::cout << "Caught FPE\n";
}
}
int main (void) {
signal(SIGFPE,(*signal_handler));
double b = 1.0;
double c = 0.0;
double d = b/c;
std::cout << "d = "<< d << std::endl;
return 0;
}
На самом деле, я получил следующий вывод:
d = inf
gcc версия 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
Что я должен сделать, чтобы бросить SIGFPE в этом случае? От каких факторов зависит поведение операции FP (флаги компилятора / тип процессора и т. Д.)?
Спасибо
3 ответа
Для чисел с плавающей запятой вы можете изменить это поведение, установив управляющее слово FPU. Посмотрите здесь
Вы не получаете сигнал, потому что поведение по умолчанию на большинстве машин заключается в загрязнении ваших данных NaN (не числом) и бесконечностью. Вы должны включить исключения с плавающей запятой, и то, как вы это делаете, зависит от конкретной машины. Посмотрите на системный заголовок fenv.h
, если у тебя есть. Функция fesettrapenable
позволяет ловить исключения с плавающей запятой на многих машинах.
К сожалению, нет стандартной функции для включения обработки исключений с плавающей запятой.