Неправильное направление SIGFPE в переполнении стека

Я пытаюсь понять странное поведение следующей программы. Очевидно, переполнение происходит во время определения глобальной переменной «ошибка», но программа выдает исключение с плавающей запятой при невинном вычислении 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 ++, так и clang ++, но в обоих

before
Floating point exception

0

Решение

const double bug = pow(10.0,pow(10.0,10.0)); должен быть использован. Потому что пау нужно (Двойной, двойной) аргумент, и вы проходите (Целое, целое)

1

Другие решения

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

0

По вопросам рекламы [email protected]