Записать рекуррентную формулу иначе C++

227
22 февраля 2018, 14:40

Проблема в том что при вычислении не хватает памяти и считает только до 7 символов после запятой, нужно чтобы считало хотя бы 10 символов после

вот само задание

#include "stdafx.h"
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;

double sum(double alpha) {
    double total_sum = 0;            // сумма  с новым слагаемым
    int denominator;            // знаменатель a_i
    double numerator = 1;            // числитель a_i
    double a_i;                    // a_i
    for (int i = 1; true; i++) {
        denominator = (1 + i*i*i)*(1 + i*i*i);
        numerator *= (-1);
        a_i = i * numerator / denominator;
        cout << "a_i  " << a_i << endl;
        total_sum += a_i;
        if (abs(a_i) <= alpha) { //    первое отброшенное слагаемое
            return total_sum;
        }
    }
}
int main() {
    setlocale(LC_ALL, "Russian");
    double alpha = 0.00000001;       // Требуемая точность
    double exact_value = -0.2284153977;    // Значение суммы ряда до 10 знака после запятой
    double Sum = sum(alpha);
    cout << "Значение суммы ряда: " << exact_value << endl;
    cout << "Приближенное значение суммы ряда:      \t" << Sum << endl;
    return 0;
}
Answer 1

Вы бы не ссылочку неработающую давали, а не поленились пояснить, что надо. А ваши "7 символов" - вангую - потому что вы при выводе просто не указали требуемую точность, вот и получили умолчание: надо

cout << setprecision(10) << exact_value << endl;

А, увас все хуже - denominator делать целочисленным категорически нельзя! Переполнение же!

double sum(double eps)
{
    double total_sum = 0;     // сумма  с новым слагаемым
    double denominator;       // знаменатель a_i
    double numerator = 1;     // числитель a_i
    double a_i;                    // a_i
    for (int i = 1; ;i++)
    {
        denominator = (1.0 + double(i)*i*i);
        numerator *= (-1);
        a_i = i * numerator / denominator / denominator;
        cout << "a_i  " << a_i << endl;
        total_sum += a_i;
        if (abs(a_i) <= eps) { //    первое отброшенное слагаемое
            return total_sum;
        }
    }
}
int main() {
    setlocale(LC_ALL, "Russian");
    double alpha = 0.000000001;       // Требуемая точность
    double exact_value = -0.2284153977;    // Значение суммы ряда до 10 знака после запятой
    double Sum = sum(alpha);
    cout << "Значение суммы ряда: " << setprecision(10) << exact_value << endl;
    cout << "Приближенное значение суммы ряда:      \t" << setprecision(10) << Sum << endl;
    return 0;
}

Вот так, примерно... Рекуррентность вам тут абсолютно не нужна и абсолютно ни при чем.

READ ALSO
Запуск окна wxWidgets в DLL с потока

Запуск окна wxWidgets в DLL с потока

Как осуществить запуск окна с нового потока?

311
возврат значения из потока

возврат значения из потока

Надо чтобы возвращаемое значение с можно было использовать как-то в int main()Как в случае передачи аргументов функции в поток принять возвращаемое...

192
Преобразование ломанной линии

Преобразование ломанной линии

Я имею неравномерную сетку в виде координат узлов в двумерном пространстве Узлы сетки хранятся в одномерном векторе, где нумерация снизу-вверх...

217
считывание с файла в поток

считывание с файла в поток

Необходимо главным потоком считывать данные с файла которые хранятся в виде строк, потоком t1 передавать структуру emp[i] в функцию для обработки,...

182