Подтвердить что ты не робот

Деление на ноль не бросает 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 (флаги компилятора/тип ЦП и т.д.)?

Спасибо

4b9b3361

Ответ 1

Для чисел с плавающей запятой вы можете изменить это поведение, установив управляющее слово FPU. Посмотрите здесь

Ответ 2

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

Это довольно хорошо объясняется в статье Википедии.

Ответ 3

Вы не получаете сигнал, потому что поведение по умолчанию на большинстве машин должно загрязнять ваши данные с помощью NaN (не-число) и бесконечностей. Вы должны включить исключения с плавающей запятой, и как вы это делаете, зависит от машины. Посмотрите на заголовок системы fenv.h, если он у вас есть. Функция fesettrapenable позволяет захватывать исключения с плавающей запятой на многих машинах.

К сожалению, нет стандартной функции для включения обработки исключений с плавающей запятой.