Ошибка -nan(ind) при работе с cos и exp
Вычисляю интеграл методом трапеций, при попытке вывести результат пишется -nan(ind). Как я понял, это возникает из-за операций с близкими к 0 числами или использовании exp(). Как это можно исправить?
#include <iostream>
#include <locale.h>
#include <math.h>
#include <omp.h>
using namespace std;
int main() {
setlocale(LC_ALL, "Ru");
int a = 0, b = 2, i, steps = 100'000'000;
double x1,x2, sum = 0, oneStep = ((double)b - a) / steps;
cout << "Вычисление интеграла методом трапеций..." << endl;
auto t = omp_get_wtime();
#pragma omp parallel private(i, x1, x2)
{
#pragma omp for reduction(+:sum)
for (i = 0; i < steps; ++i)
{
x1 = a + (i * oneStep);
x2 = a + (i * 1.0) + oneStep;
sum += ((cos(exp(x1 / 3.0) + 0.2 * x1)) + (cos(exp(x2 / 3.0) + 0.2 * x2)))/2;
}
}
sum *= oneStep;
t = omp_get_wtime() - t;
cout << "Значение интеграла равно " << sum << endl << "Вычисление заняло " << t << " секунд." << endl;
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
У вас в
x1 = a + (i * oneStep);
x2 = a + (i * 1.0) + oneStep;
для x2 явно неверная формула... явно перепутали + и *...:
x2 = a + (i + 1.0)*oneStep;
Получаются сверхбольшие значения для exp...