Отдел на ноль не бросает 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 работают поведение зависят от (тип компилятора / тип процессора и т. Д.)?

Спасибо

17
задан Pascal Cuoq 1 September 2011 в 08:36
поделиться

1 ответ

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

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

5
ответ дан 30 November 2019 в 13:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: