Я пытаюсь понять странное поведение следующей программы. Очевидно, переполнение происходит во время определения глобальной переменной «ошибка», но программа выдает исключение с плавающей запятой при невинном вычислении 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
const double bug = pow(10.0,pow(10.0,10.0));
должен быть использован. Потому что пау нужно (Двойной, двойной) аргумент, и вы проходите (Целое, целое)
Однажды я столкнулся с подобным случаем, когда ошибка с плавающей точкой проявлялась в незнакомых местах. Как я понял, это произошло потому, что регистр состояния FPU синхронизируется не во время каждой инструкции с плавающей запятой, поэтому ошибка может казаться случайной. Кстати, я только что скомпилировал и запустил вашу программу, и она завершилась без проблем.
Мое решение состояло в том, чтобы очистить регистр состояния FPU после неправильного вычисления (конечно, это взлом, но в то время я не мог анализировать эту математическую библиотеку).