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