С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.73
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
#1

Точное вычисление суммы ряда - C++

17.09.2009, 18:15. Просмотров 3606. Ответов 23
Метки нет (Все метки)

Необходимо вычислить сумму ряда 1/1+1/2+...+1/n. Известно, что в с++ подобные вычисления не точные и большую роль играет способ и порядок суммирования. Необходимо получить наиболее точный результат... Есть идеи?=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.09.2009, 18:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Точное вычисление суммы ряда (C++):

Вычисление суммы ряда - C++
Составить программу для вычисления суммы ряда

Вычисление суммы ряда C++ - C++
Помогите пожалуйста написать код к этим заданиям, и желательно с объяснением, а то ничего не понимаю) 1. Задания надо переписывать в...

Вычисление суммы ряда - C++
Помогите решить задачку!!! Спросить у пользователя n, вычислить 1*2+2*3+...+(n-1)*n!!!

Вычисление суммы ряда. - C++
Помогите, пожалйста!!! Вычислить сумму бесконечного ряда Y=(fabs)ak, где а=-0,1(аk-1+аk+1) при k=2,3,4... Вычисления окончить при...

Вычисление суммы ряда - C++
Вычислить \sum_{i=1}^{\propto }i^2 пока S<50 с помощью цикла while

Вычисление суммы ряда - C++
1^2+3^2+5^2+...+(2n-1)^2

23
HIMen
4150 / 1399 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
17.09.2009, 18:37 #2
Этот ряд расходится, у него нельзя посчитать точную сумму, только частичную
0
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 18:39  [ТС] #3
Цитата Сообщение от HIMen Посмотреть сообщение
Этот ряд расходится, у него нельзя посчитать точную сумму, только частичную
Возможно, не совсем правильно выразился...
Предположим, что n - известно, те количество слагаемых не бесконечно.
0
HIMen
4150 / 1399 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
17.09.2009, 18:44 #4
C++
1
2
3
4
5
6
7
double sum=0.0;
int n=4;
for(int i=1; i<n+1; i++)
{
    sum+=1.0/i;
}
cout << sum;
0
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 18:56  [ТС] #5
Спасибо, конечно....
Но до этого я как бы и сам додумался=)
Фишка в том, что в c++ деление 1/i, когда i не степень двойки, не совсем точно.
Алгоритм, представленный Вами, даст ответ наиболее далекий от истины...
0
HIMen
4150 / 1399 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
17.09.2009, 19:00 #6
Сумма n первых членов гармонический ряда:
Sn = ln(n) +С+ E,
где С = 0,577215... — Эйлера постоянная, а E->0 при n->к бесконечности.
0
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 19:11  [ТС] #7
Цитата Сообщение от HIMen Посмотреть сообщение
Сумма n первых членов гармонический ряда:
Sn = ln(n) +С+ E,
где С = 0,577215... — Эйлера постоянная, а E->0 при n->к бесконечности.
Это тоже не достаточно точно, особенно для небольших n....
Возможно, тут стоит подойти с другой стороны.
Например, сумма от 1/n до 1/1 будет вычислена более точно, чем от 1/1 до 1/n. Сумма дробей где знаменатель - степень двойки будет вычислена абсолютно точно. Так же есть некоторые дроби, например 1/3 и 1/6, чья сумма 1/2, что тоже дает точный результат....
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
17.09.2009, 19:23 #8
Попробуйте, для начала, как-нибудь упростить ряд. Возможно, при некотором разложении, нектоторые элементы сократятся.

Добавлено через 5 минут
Точнее не сократятся, а дадут нужную степень.
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 19:26 #9
можно считать в рациональных числах, представляя их как
C++
1
2
3
4
5
6
7
class rational
{
public:
  int numerator;
  int denominator;
.....
}
0
HIMen
4150 / 1399 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
17.09.2009, 19:26 #10
Можно делить на i не единицу а какое-то число, чем оно больше, тем наверно точнее
C++
1
2
3
4
5
6
7
8
9
10
unsigned long double sum1=0.0, sum2=0.0;
_int64 num=1000000000;
for(_int64 i=1; i<num+1; i++)
{
    sum1+=1000000000000.0/i;
    sum2+=1.0/i;
}
cout.precision(40);
cout << sum1/1000000000000.0 << endl << sum2 << endl;
cout << log(1000000000.0)+0.57721566490153286060651209008240243;
Возможно будет еще точнее если взять это число 1*2*3*... например 18!
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 19:38 #11
да, и еще, значения, при которых теряется точность составляют n~10 в 15
0
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 19:40  [ТС] #12
Цитата Сообщение от Lolcht0 Посмотреть сообщение
можно считать в рациональных числах, представляя их как
Не понял идеи Можно поподробнее?
0
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 19:45 #13
скорее всего идея бессмысленна))) потому что пост номер 11.

но вообще, суть в том, что представлять числа в виде дробей с целым числителем и знаменателем.
0
Delphin_KKC
UNIX-way
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
17.09.2009, 19:49 #14
Математически существует следующее равенство:
(1/a)+(1/b)=(a+b)/(a*b)
Его использование в два раза сократит количество операций деления.
0
Delphin_KKC
UNIX-way
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
17.09.2009, 19:59 #15
Кроме того, если сумму указанного ряда обозначить как S, то справедлива формула, указанная на рисунке.
Для вычисления суммы в числителе дроби можно использовать целочисленное деление, так как "i" является делителем "n!". А факториал достаточно вычислить один раз и сохранить в переменной.
Однако, способ годится лишь для n <= 12 (при условии отведения 4 байт на хранение факториала).
0
Миниатюры
Точное вычисление суммы ряда  
17.09.2009, 19:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2009, 19:59
Привет! Вот еще темы с ответами:

Вычисление суммы ряда - C++
Всем доброго времени суток! Есть ряд: \sum_{n=0}^\infty (-1)^n * (a+b*n)/x^n Есть вот такая неработающая программа: ...

Вычисление суммы ряда - C++
ребята помогите решить. составьте пожалуйста код!) б) \sum_{n = 1}^{12} (10n - 8/ 10*n*n - 3*n + 8)

Вычисление суммы ряда - C++
Помогите, задали задание написать программу. Пользователь вводит значение 2-х переменных: х-угол и n-количество раз. суть программы...

Вычисление суммы ряда 1^k+2^k+...+n^k - C++
Даны натуральные числа n и k. Составить программу вычисления выражения 1^k+2^k+...+n^k. Помогите пожалуйста. Оператор pow использовать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.