Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
#1

Чему равна сумма 10^10 членов гармонического ряда? - C++

17.08.2014, 00:28. Просмотров 1438. Ответов 33
Метки нет (Все метки)

С точностью 12 знаков после запятой. Сколько времени считается, на каком оборудовании?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2014, 00:28
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Чему равна сумма 10^10 членов гармонического ряда? (C++):

Чему равна минимальная сумма первых членов последовательности, превышающая некоторое заданное число R
Помогите решить! Дана последовательность 1/2, 1/3, 1/4, … . Чему равна...

Найти сумму первых N членов гармонического ряда
Написать программу, которая вычисляет ряд такого вида: 1+ 1/2+1/3+1/4+… от...

Написать программу: сумма гармонического ряда
Дано число A (> 1). Вывести наибольшее из целых чисел K, для которых сумма 1 +...

Чему равна сумма цифр числа n.
Чему равна сумма цифр числа n. Параметр n задать при опросе. помогите...

Чему равна сумма значений переменных
Чему равна сумма значений переменных a, b, c после выполнения фрагмента...

Сколько цифр в числе и чему равна их сумма?
дано натуральное число n(n<=100) a) Сколько цифр в числе n? б) Чему равно...

33
Andrej
И целого heap'а мало
94 / 55 / 17
Регистрация: 31.07.2014
Сообщений: 291
17.08.2014, 01:10 #2
В матане не очень смыслю и может так быть, местные гуру поправят. Но если считать сумму ряда с определённой точностью, то берётся какая-то эпсилон (мера сравнения) и по мере суммирования сравниваем её с приростом, дельтой. Как только дельта оказалась меньше эпсилон, посчитали. При чём тут количество членов ряда (если, конечно, тупо не сложить данное число членов)?
Либо по точности, либо по количеству.
Цитата Сообщение от zer0mail Посмотреть сообщение
Сколько времени считается
1. берёте ряд
2. кодируете
3. засекаете время
Зависит от ряда и от техники. Ну вот на парах считали похожее на ноуте пару минут с низкой точностью - порядка 10 знаков.
0
zer0mail
2451 / 2085 / 216
Регистрация: 03.07.2012
Сообщений: 7,566
Записей в блоге: 1
17.08.2014, 01:17  [ТС] #3
Видно, что в матане не смыслите

Не надо рассказывать "как" - просто возьми и сделай. Напиши ответ: Сумма равна XXX, времени на расчет затратил YYY, процессор ZZZ.
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 01:53 #4
Считал "в лоб" в цикле. Если не ошибся, то 23.603066594997500, 75 секунд, процессор Intel Pentium CPU G850 2.90GHz

Добавлено через 6 минут
zer0mail, а зачем вам это?

Добавлено через 17 минут
UPD посчитал "с конца" - время то же, процессор тот же, сумма другая: 23.603066594888269, отклонение от "прямой" 1.092317347684002e-10, превышает необходимую точность расчета. Я не знаю есть ли среди обеих сумм верная, но я бы "обратной" сумме верил больше
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 02:28 #5
Цитата Сообщение от _Ivana Посмотреть сообщение
Считал "в лоб" в цикле. Если не ошибся, то 23.603066594997500, 75 секунд, процессор Intel Pentium CPU G850 2.90GHz
Да ладно! 10^10 членов - это же 10 000 000 000 (10 миллиардов). У меня миллион вычисляется 2 минуты. А когда ставлю 10 миллионов циклов - вообще ни конца ни края не видно вычислениям.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main ()
{
    using namespace std;
 
    const long double STOP_LOOP = 1000000.0;
    long double sum = 0.0;
    for (long double k = 1.0; k<STOP_LOOP; ++k)
    {
        sum +=(1.0 / k);
        cout << fixed;
        cout.precision(12);
        cout.setf(ios_base::showpoint);
        cout << sum << endl << endl;
    }
 
    cout << "Finally, sum = " << sum << endl << endl;
 
    return 0;
}
P.S. Конфиг моего компа:
DualCore AMD Athlon 64 X2, 2300 MHz (11.5 x 200) 4400+, Gigabyte GA-MA770-UD3 v2.0, 2048 Мб (DDR2-667 DDR2 SDRAM), NVIDIA GeForce 8600 GTS (256 Мб), ST3750528AS (750 Гб, 7200 RPM, SATA-II).
0
Миниатюры
Чему равна сумма 10^10 членов гармонического ряда?  
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 02:35 #6
пример расчета за 2 секунды - техника дошла...
Я в Матлабе считал, если что
1
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 02:44 #7
Цитата Сообщение от _Ivana Посмотреть сообщение
Я в Матлабе считал
Ааа... ну тогда понятно. Эх, а я то, со свиным рылом, да в калашный ряд
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 02:45 #8
gru74ik,
C
1
long double k
имхо плохо инкрементируется - надо целый тип. И конечно же вы выкинули из цикла все лишнее - вывод промежуточных результатов, например?
ЗЫ не, ну ТС не ограничивал выбор программных средств хотя и в С должен не медленнее посчитаться, надо будет попробовать. а Вольфрам Альфа по ссылке дает за секунду 100500 десятичных знаков ....
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 03:09 #9
Цитата Сообщение от _Ivana Посмотреть сообщение
имхо плохо инкрементируется - надо целый тип
Так получше?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
int main ()
{
    const long long STOP_LOOP = 1000000;
    long double sum = 0.0;
    long double k = 1.0;
    for (long long i=1; i<STOP_LOOP; ++i)
    {
        sum += (1.0 / k);
        std::cout << std::fixed;
        std::cout.precision(12);
        std::cout.setf(std::ios_base::showpoint);
        std::cout << i << ".\t\t\t" << sum << std::endl << std::endl;
        k += 1.0;
    }
 
    std::cout << "\nFinally, sum = " << sum << std::endl << std::endl;
 
    return 0;
}
0
MastAKK
145 / 136 / 18
Регистрация: 13.10.2012
Сообщений: 592
17.08.2014, 03:16 #10
gru74ik, лучше целый тип, как говорили выше. Просто при делении явно приводите его в double.
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 03:17 #11
Ну вы сами по времени должны увидеть, получше или нет. И неужели вы выводите в цикле каждый раз std::cout !?!?! Так у вас и месяца не хватит. Убирайте из цикла все лишнее, я же вам говорил! И потестируйте на миллионе сначала - но с минимальными действиями в цикле
ЗЫ и подскажите как printf long double в строку сделать - я на этом застрял, не могу проверить свой код ))))
1
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 03:22 #12
На компе сына миллион итераций 5 минут считалось.
Конфиг компа:
Кликните здесь для просмотра всего текста

Центральный процессор QuadCore Intel Core i5-4440, 3100 MHz

Материнская плата MSI B85M-E33 LGA 1150, mATX, Retail

Чипсет системной платы Intel Lynx Point B85, Intel Haswell

Системная память 8120 МБ (DDR3-1333 DDR3 SDRAM)
DIMM1: Corsair Vengeance CMZ8GX3M2A1600C9 4 ГБ DDR3-1333 DDR3 SDRAM
DIMM3: Corsair Vengeance CMZ8GX3M2A1600C9 4 ГБ DDR3-1333 DDR3 SDRAM

Видеокарта 2Gb PCI-E GeForce GTX 760, ASUS [GTX760-DCMOC-2GD5] (GDDR5, 192bit, 2xDVI, HDMI, DisplayPort, PCI-E_3.0) RTL

Монитор Acer AL1916W [19" LCD] (L520912663E1)

Звуковой адаптер nVIDIA HDMI/DP @ nVIDIA GK104 - High Definition Audio Controller

Звуковой адаптер Realtek ALC887 @ Intel Lynx Point PCH - High Definition Audio Controller [C-2]

Дисковый накопитель SSD Smartbuy Ignition 2 SB120GB-IGNT-25SAT3, 120Гб, SATA III

Дисковый накопитель HDD WDC WD10EZEX-00ZF5A0 ATA Device (1000 ГБ, 7200 RPM, SATA-III)

Сетевой адаптер Realtek PCIe GBE Family Controller

Блок питания ATX Zalman 500W (ZM-500GS) APFC, ATX 2.31, 120mm FAN + 4x HDD + 6x SATA, + 2x PCIE 6pin , black, RTL

Охлаждение ЦП Cooler DeepCool GAMMAXX 200

Корпус MiniTower ZALMAN ZM-T2 PLUS, mATX, Чёрный (без блока питания) 270mm VGA. USB3.0, FAN120 LED

Вентилятор Arctic Cooling F12 PWM для ATX корпуса 120x120 (600 - 1350 rpm, 57 CFM, 24.4 dBA, 4 pin, Гидродинамический)

Вентилятор Arctic Cooling F9 PWM для ATX корпуса 92x92 (550 - 1800 rpm, 35 CFM, 23,5dBA, 4pin, Гидродинамический)
0
Миниатюры
Чему равна сумма 10^10 членов гармонического ряда?  
MastAKK
145 / 136 / 18
Регистрация: 13.10.2012
Сообщений: 592
17.08.2014, 03:24 #13
gru74ik, так долго считается из-за кучи выводов в консоль.

Добавлено через 50 секунд
_Ivana,
C++
1
printf("%le", a);
Если не ошибаюсь.
1
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 03:26 #14
C++
1
wsprintfW(buf, L"%le", sum);
Выводит букву "e". Если после l идет f, a или другая буква - выводит ее Вот проблема-то, программа работает - результат вывести не могу ))))
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 03:33 #15
Цитата Сообщение от _Ivana Посмотреть сообщение
неужели вы выводите в цикле каждый раз std::cout !?!?! Так у вас и месяца не хватит.
Цитата Сообщение от MastAKK Посмотреть сообщение
gru74ik, так долго считается из-за кучи выводов в консоль.
Всё, дошло. Вот так быстро считает (правда, только 10^9):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main ()
{
    const long long STOP_LOOP = 1000000000;
    long double sum = 0.0;
 
    for (long long k=0; k<STOP_LOOP; ++k)
        sum += (1.0 / k);
 
    std::cout << std::fixed;
    std::cout.precision(12);
    std::cout.setf(std::ios_base::showpoint);
    std::cout << "\nFinally, sum = " << sum << std::endl << std::endl;
 
    return 0;
}
0
Миниатюры
Чему равна сумма 10^10 членов гармонического ряда?  
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 03:36 #16
Мне бы ваши сложности А я все не могу победить вывод результата... В описании функции вообще не нашел вывод плавающих чисел....
0
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 03:39 #17
Тьфу, ёпрст. Опять с кодом напутал. Вот как надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
int main ()
{
    const long long STOP_LOOP = 10000000000;
    long double sum = 0.0;
 
    for (long long k=1; k<=STOP_LOOP; ++k)
        sum += (1.0 / k);
 
    std::cout << std::fixed;
    std::cout.precision(12);
    std::cout.setf(std::ios_base::showpoint);
    std::cout << "\nFinally, sum = " << sum << std::endl << std::endl;
 
    return 0;
}
0
Mr.X
Эксперт С++
3178 / 1705 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
17.08.2014, 03:46 #18
Лучший ответ Сообщение было отмечено IrineK как решение

Решение

В асимптотической приближенной формуле Эйлера из Википедии взял всего два члена ряда, и уже достигается требуемая точность:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/////////////////////////////////////////////////////////////////////////////////////////
// Чему равна сумма 10^10 членов гармоническнго ряда с точностью 12 знаков после запятой.
/////////////////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iomanip>
#include <iostream>
/////////////////////////////////////////////////////////////////////////////////////////
void    set_n_th_partial_sum_of_harmonic_series
    (
        double      n,
        double  &   partial_sum
    )
{
    static  const   double  GAMMA   =   0.57721566490153286;
 
    partial_sum                     =       log(n) 
                                        +   GAMMA 
                                        +   1.0 / 2 / n 
                                        -   1.0 / 12 / n / n;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    for(;;)
    {
        double  n   =   0;
        std::cout   <<  "n = ";
        std::cin    >>  n;
 
        double  partial_sum   =   0;
        double  partial_sum_pract   =   0;
        double  precision_theor     =   0;
        double  precision_pract     =   0;
 
        set_n_th_partial_sum_of_harmonic_series
            (
                n,
                partial_sum
            );
 
        std::cout   <<  "Частичная сумма: "
                    <<  std::fixed
                    <<  std::setprecision(20)
                    <<  partial_sum
                    <<  std::endl
                    <<  std::endl;
    }//for
}
1
gru74ik
Модератор
Эксперт CЭксперт С++
4648 / 1962 / 293
Регистрация: 20.02.2013
Сообщений: 5,226
Записей в блоге: 23
17.08.2014, 03:47 #19
Цитата Сообщение от _Ivana Посмотреть сообщение
Мне бы ваши сложности А я все не могу победить вывод результата... В описании функции вообще не нашел вывод плавающих чисел....
А тебе (давай на ты что ли?) обязательно в винде надо и обязательно на Си ?
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
17.08.2014, 03:51 #20
Я хотел просто взять свой код тетриса, вставить в него за пару секунд код расчета, запуская его по горячей клавише и вывести результат в поле окна, которое уже есть. Чтобы было по-быстрому Но такой засады с форматированием и выводом я не ожидал!... Хоть на чем, у меня код вывода такой:
C++
1
2
3
    wchar_t buf[50];
    wsprintfW(buf, L"%lf", sum);
    SetWindowTextW(hwndSta3, buf);
если подскажете, как на С++ красиво сделать, будет неплохо.
0
17.08.2014, 03:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2014, 03:51
Привет! Вот еще темы с решениями:

Найти произведение членов пифагорейского триплета, сумма которых равна заданному числу
Здравствуйте! Пожалуйста, помогите. Неизвестный автор пишет программу...

Определить сколько цифр в заданном натуральном числе, и чему равна сумма его цифр
Дано натуральное число n (n&lt;=100). Определить сколько цифр в числе n, чему...

сумма первыйх членов ряда
Написать программу, которая вычисляет сумму первых п членов ряда: 1, 3, 5, 7...

Сумма членов числового ряда
Дано числовой ряд: Найти сумму ряда с точностью Е=10-5 Помогите...


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

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

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