выводит неправильные значения

176
26 ноября 2016, 19:06

В чем ошибка?задание вычисление функции разложения в ряд. во внутреннем цикле значение суммы ТЕКСТ ЗАДАНИЯ

#include<cmath>
#include<iostream>
using namespace std;
int factorial(int n)
{
    int fact = 1;
    for (int i = 1; i <= n; i++)
    {
        fact *= i;
    }
    return fact;
}
int main()
{
    int i, n;
    double x, xx, sum = 0.0, summa = 0.0, eps = 0.25;
    cin >> n;
    for (i = 0; i < n; i++)
    {
        cin >> x;
        xx = (-1) * x * x + 1;
        sum = eps + 1;
        if (abs(sum) > eps)
        {
            sum = pow(xx, i) / factorial(i);
            summa += sum;
        }
        cout << "Значение приближенное по eps:" << ' ' << summa << ' ' <<
             endl;
        cout << "Значение без eps:" << ' ' << pow(M_E, xx) << endl;
    }
}

входные данные n=5 х1=-2.7 х2=-0.1 х3=2.9 х4=17.9 х5=117.0

Answer 1
if(abs(sum)>eps)

замените на

while(abs(sum)<eps)

с соответствующим изменением sum перед началом цикла, и уберите цикл for. Впрочем, у вас наворочено гораздо больше, чем одна ошибка. Что вы, собственно, хотите вычислять? По исходнику - вроде бы

Так? Словом, дайте четкое ТЗ, тогда будет проще набросать вам нормальный код, чем исправлять это...

Ну, раз внесено исправление ТЗ...

const double eps = 1e-12;
int main(int argc, const char * argv[])
{
    int N;
    cout << "Number of trials? ";
    cin >> N;
    for(int n = 0; n < N; ++n)
    {
        cout << "Trial " << (n+1) << ". x = ";
        double x;
        cin >> x;
        cout << "x = " << x;
        x = 1.0 - x*x;
        cout << "; exp(1-x^2) = " << exp(x);

        int i = 1;
        double term = 1.0, sum = 1.0;
        while(abs(term) > eps)
        {
            sum += term *= x/i++;
        }
        cout << "; series = " << sum << "\n\n";
    }
}

Только учтите, что реально это будет вычисляться ну, где-то при |x|<=4. Дальше этот метод просто не будет работать - из-за того, что члены сначала будут крепко расти, а уж потом уменьшаться, так что погрешность вычислений сведет все на нет. В лучшем случае, если поменять порядок вычислений и пытаться суммировать с учетом всех нюансов - ну, может, еще немного и получится поднять диапазон. Но ни для запрашиваемых вами 17.9, ни тем более для 117 вы ничего разумного не получите...

READ ALSO
Как создавать ярлыки средствами С++, WinAPI

Как создавать ярлыки средствами С++, WinAPI

Пишу инсталлятор, который, как принято, должен создавать ярлык на рабочем столе и группу в меню ПускНаходил в сети много вариантов одной и той...

352
Считывание пробела

Считывание пробела

Добрый деньИзучаю инструкцию SWITCH

192
zlib сжатие потока

zlib сжатие потока

На первый write все хорошо, 2 и следующие возвращают Z_BUF_ERROR

188
Сборка Boost - не может найти файл corecrt.h

Сборка Boost - не может найти файл corecrt.h

Нужно срочно собрать Boost 1_62_0 на Windows 7 x64 SP1Нет файла corecrt

278