SIGFPE неправильное направление в C ++

0

Я пытаюсь понять странное поведение следующей программы. Очевидно, что переполнение происходит во время определения глобальной переменной "ошибка", но программа выдает исключение с плавающей запятой во время невинных вычислений 1.0 + 2.0.

#include <iostream>
#include <cmath>
#include <fenv.h>

using namespace std;

const double bug = pow(10.0,pow(10.0,10.0));

int main(void)
{
  feenableexcept(-1);

  cout << "before" << endl;
  cout << 1.0 + 2.0 << endl;
  cout << "after" << endl;

  return 0;
}

Я попытался скомпилировать его как с g++, так и с кланом g++, но получил тот же результат в обоих

before
Floating point exception
  • 0
    Я не уверен, но, возможно, потому что флаг исключения устанавливается, когда вы их включаете, но он не проверяется, пока вы не выполните сложение.
Теги:
sigfpe

2 ответа

1

const double bug = pow(10.0,pow(10.0,10.0)); должен быть использован. Поскольку аргумент pow need (double, double) и вы передаете (int, int)

  • 0
    Я получаю такое же поведение, когда я использую 10.0 вместо 10
  • 0
    @ user2535797 Пожалуйста, измените ваш вопрос с новым кодом.
Показать ещё 1 комментарий
0

Как только я столкнулся с подобным случаем, когда ошибка с плавающей запятой проявилась в странных местах. Как я понял, это произошло потому, что регистр статуса FPU синхронизирован не во время каждой инструкции с плавающей точкой, поэтому ошибка может показаться случайной. Кстати, я только что скомпилировал и запустил вашу программу, и она закончилась без каких-либо проблем. Мое решение состояло в том, чтобы очистить регистр статуса FPU после ошибочного вычисления (конечно, это взломать, но в то время я не мог проанализировать эту математическую библиотеку).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню