Форум программистов, компьютерный форум CyberForum.ru

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

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

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

Добавлено через 5 минут
Точнее не сократятся, а дадут нужную степень.
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;
.....
}
HIMen
 Аватар для HIMen
4109 / 1358 / 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!
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 19:38     Точное вычисление суммы ряда #11
да, и еще, значения, при которых теряется точность составляют n~10 в 15
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 19:40  [ТС]     Точное вычисление суммы ряда #12
Цитата Сообщение от Lolcht0 Посмотреть сообщение
можно считать в рациональных числах, представляя их как
Не понял идеи Можно поподробнее?
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 19:45     Точное вычисление суммы ряда #13
скорее всего идея бессмысленна))) потому что пост номер 11.

но вообще, суть в том, что представлять числа в виде дробей с целым числителем и знаменателем.
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
17.09.2009, 19:49     Точное вычисление суммы ряда #14
Математически существует следующее равенство:
(1/a)+(1/b)=(a+b)/(a*b)
Его использование в два раза сократит количество операций деления.
Delphin_KKC
UNIX-way
 Аватар для Delphin_KKC
710 / 494 / 17
Регистрация: 15.01.2009
Сообщений: 1,721
17.09.2009, 19:59     Точное вычисление суммы ряда #15
Кроме того, если сумму указанного ряда обозначить как S, то справедлива формула, указанная на рисунке.
Для вычисления суммы в числителе дроби можно использовать целочисленное деление, так как "i" является делителем "n!". А факториал достаточно вычислить один раз и сохранить в переменной.
Однако, способ годится лишь для n <= 12 (при условии отведения 4 байт на хранение факториала).
Миниатюры
Точное вычисление суммы ряда  
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 20:08  [ТС]     Точное вычисление суммы ряда #16
Цитата Сообщение от Lolcht0 Посмотреть сообщение
да, и еще, значения, при которых теряется точность составляют n~10 в 15
не скажи.... например
C++
1
2
3
4
5
6
7
8
9
10
11
12
unsigned long double sum1=0.0, sum2=0.0;
_int64 num=1000000000;
for(_int64 i=1; i<num+1; i++)
{
    sum1+=1.0/i;
}
for(_int64 i=num; i>0; i--)
{
    sum2+=1.0/i;
}
cout.precision(40);
cout << sum1 << endl << sum2 << endl;
В результате
sum1 = 21.30048150234855
sum2 = 21.300481502346148
А это уже большая разница...

Добавлено через 1 минуту
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
Математически существует следующее равенство:
(1/a)+(1/b)=(a+b)/(a*b)
Его использование в два раза сократит количество операций деления.
Цитата Сообщение от Delphin_KKC Посмотреть сообщение
Однако, способ годится лишь для n <= 12 (при условии отведения 4 байт на хранение факториала).
Оба варианта не подходят для больших n...
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 20:09     Точное вычисление суммы ряда #17
это никакая разница. физические условия дадут на порядки большую погрешность
Nikituki
0 / 0 / 0
Регистрация: 17.09.2009
Сообщений: 15
17.09.2009, 20:19  [ТС]     Точное вычисление суммы ряда #18
Цитата Сообщение от Lolcht0 Посмотреть сообщение
это никакая разница. физические условия дадут на порядки большую погрешность
Значение изменилось даже при изменении порядка суммирования....
Нужен более точный алгоритм...
И ответ: "И так пойдет!", не подходит....
Lolcht0
123 / 121 / 5
Регистрация: 30.03.2009
Сообщений: 766
17.09.2009, 20:27     Точное вычисление суммы ряда #19
да пожалуйста! то, что предлагал вам я, а это тоже самое, фактически, что предлагал Delphin_KKC. длинную арифметику и кластеры вам в руки!

только это лишено всяческого смысла)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2009, 21:07     Точное вычисление суммы ряда
Еще ссылки по теме:

C++ Вычисление суммы ряда C++
C++ Вычисление суммы ряда
C++ Вычисление суммы ряда
Вычисление суммы ряда 1^k+2^k+...+n^k C++
C++ Вычисление суммы ряда

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

Или воспользуйтесь поиском по форуму:
HIMen
 Аватар для HIMen
4109 / 1358 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
17.09.2009, 21:07     Точное вычисление суммы ряда #20
Цитата Сообщение от Nikituki Посмотреть сообщение
Оба варианта не подходят для больших n...
для очень больших n формула Эйлера, мне кажется будет самое точное
Yandex
Объявления
17.09.2009, 21:07     Точное вычисление суммы ряда
Ответ Создать тему
Опции темы

Текущее время: 01:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru