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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
#1

Сумма ряда до точность E - C++

08.10.2012, 18:26. Просмотров 1251. Ответов 21
Метки нет (Все метки)

Четвёртый член ряда равен 0.001411 (можете проверить запустив программу)
Вопрос: почему не срабатывает строчка (последняя) if(E<b) printf("Sum ryada do tochnosty %f ravna: %f\n", E, w); Когда 0.0001<0.001411?

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
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int function();
 
int main()
{
    int factor, count, n, q, sum;
    float x;
    double y, z, w;
    double b;
    float E; //это наша точность
    E = 0.0001;
    w = 0; // для подсчёта суммы ряда
        x = 2
 
    for(n=1;n<=5;n++) {
    y = pow(x, 2*n+1);
    z = pow(-1.0, n);
    printf("y: %.0f\nz: %.0f\n", y, z);
 
    q = 2*n+1;
    factor=1;
    for(count=1;count<=q;count++) factor= factor*count;
    printf("Faktorial chisla %d raven %d\n", q, factor);
 
    b = z/factor*y;
    printf("%f\n\n", b);
 
    w = b+w;
 
    if (n==5) cout << w << '\n';
    }
 
    if(E<b) printf("Sum ryada do tochnosty %f ravna: %f\n", E, w);
    
 
 
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.10.2012, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сумма ряда до точность E (C++):

Вычислить сумму бесконечного ряда с заданной точность для значения x - C++
Вычислить суму бесконечного ряда с заданной точностью ε &lt; 1 для –1 &lt; x &lt; 1 Программа должна содержать простое меню, которое...

Вычисление функции прекратить, если достигнута заданная точность e, либо взято в разложении ряда m членов - C++
подскажите пожалуйста как примерно хотя бы составляется данное уравнение программно условие Ввести e, m и x. Вычислить...

сумма ряда - C++
не могу написать код для нахождения суммы ряда вот условие::

Сумма ряда - C++
\sum_{i=1}^{k}log_{10}(\sqrt{2\cdot \frac{1}{i^2}})\;,\;k\lt 35 #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;math.h&quot; using...

Сумма ряда - C++
Извиняюсь за такую глупость) но сильно туплю насчет этого: #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; ...

Сумма ряда - C++
вот пример, надо написать програмку, которая вычисляет суму ряда с точностью Е=10^-5 Проблема в том, что я не знаю, как вообще...

21
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 18:34 #2
сравнивай по абсолютному значению
0
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 18:42  [ТС] #3
Цитата Сообщение от Nixy Посмотреть сообщение
сравнивай по абсолютному значению
Это как? Почему нельзя сравнивать так?
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 18:48 #4
сравнивать можно но у тебя члены ряда могут быть и положительными, и отрицательными, в частности 5 член отрицательный и он меньше погрешности она положительна, но по абсолютному значению погрешность будет меньше , для нахождения абсолютного значения используй функцию fabs();
0
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 18:56  [ТС] #5
Цитата Сообщение от Nixy Посмотреть сообщение
сравнивать можно но у тебя члены ряда могут быть и положительными, и отрицательными, в частности 5 член отрицательный и он меньше погрешности она положительна, но по абсолютному значению погрешность будет меньше , для нахождения абсолютного значения используй функцию fabs();
Да, 5-й член меньше, да и все остальные, кроме 4-го. Если четвёртый работает, то почему не работает if(E<b) printf("Sum ryada do tochnosty %f ravna: %f\n", E, w); ?
На счёт fabs, то if(fabs(E)<fabs(b)) printf("Sum ryada do tochnosty %f ravna: %f\n", E, w); всё равно ничего не выводит.
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:04 #6
ну для начала еще неплохо былобы засунуть проверку внтурь цикла
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
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int function();
 
int main()
{
    int factor, count, n, q, sum;
    float x;
    double y, z, w;
    double b;
    float E; //это наша точность
    E = 0.0001;
    w = 0; // для подсчёта суммы ряда
        x = 2
 
    for(n=1;n<=5;n++) {
    y = pow(x, 2*n+1);
    z = pow(-1.0, n);
    printf("y: %.0f\nz: %.0f\n", y, z);
 
    q = 2*n+1;
    factor=1;
    for(count=1;count<=q;count++) factor= factor*count;
    printf("Faktorial chisla %d raven %d\n", q, factor);
 
    b = z/factor*y;
    printf("%f\n\n", b);
    if(E<fabs(b)) {
       printf("Sum ryada do tochnosty %f ravna: %f\n", E, w);
       n=5;// чтобы цикл больше не делал либо break; поставь
   } 
   else
    w = b+w;
 
    }
    
 
    system("pause");
    return 0;
}
1
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 19:24  [ТС] #7
Цитата Сообщение от Nixy Посмотреть сообщение
ну для начала еще неплохо былобы засунуть проверку внтурь цикла
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
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int function();
 
int main()
{
    int factor, count, n, q, sum;
    float x;
    double y, z, w;
    double b;
    float E; //это наша точность
    E = 0.0001;
    w = 0; // для подсчёта суммы ряда
        x = 2
 
    for(n=1;n<=5;n++) {
    y = pow(x, 2*n+1);
    z = pow(-1.0, n);
    printf("y: %.0f\nz: %.0f\n", y, z);
 
    q = 2*n+1;
    factor=1;
    for(count=1;count<=q;count++) factor= factor*count;
    printf("Faktorial chisla %d raven %d\n", q, factor);
 
    b = z/factor*y;
    printf("%f\n\n", b);
    if(E<fabs(b)) {
       printf("Sum ryada do tochnosty %f ravna: %f\n", E, w);
       n=5;// чтобы цикл больше не делал либо break; поставь
   } 
   else
    w = b+w;
 
    }
    
 
    system("pause");
    return 0;
}
Я сделал немного по своему всё же(про то что в цикл его не добавил - моя невнимательность). Теперь всё работает. Интересно, а как сделать максимальную точность(она вроде бы зависит от компьютера)?
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
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
 
int function();
 
int main()
{
    int factor, count, n, q, sum;
    float x;
    double y, z, w;
    double b;
    float E; //это наша точность
    E = 0.0001;
    w = 0; // для подсчёта суммы ряда
 
    printf("Enter x:\n");
    scanf("%f", &x);
 
    for(n=1;n<=5;n++) {
    y = pow(x, 2*n+1);
    z = pow(-1.0, n);
    printf("y: %.0f\nz: %.0f\n", y, z);
 
    q = 2*n+1;
    factor=1;
    for(count=1;count<=q;count++) factor= factor*count;
    printf("Faktorial chisla %d raven %d\n", q, factor);
 
    b = z/factor*y;
    printf("%f\n\n", b);
 
    w = b+w;
 
    if (n==5) cout << w << '\n';
 
    if(E<fabs(b)) printf("Sum ryada do tochnosty %f ravna: %f\n", E, w);
    }
    
 
 
    system("pause");
    return 0;
}
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:32 #8
она зависит от типа вроде, я сам могу ошибатся но вот этот код покажет машинный 0
C++
1
2
3
4
5
6
7
8
double MachineZero(){
    double u,v=1;
    do{
         u=v;
         v/=2;
    }while (u+1>1);
    return u;
}
1
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 19:42  [ТС] #9
Цитата Сообщение от Nixy Посмотреть сообщение
она зависит от типа вроде, я сам могу ошибатся но вот этот код покажет машинный 0
C++
1
2
3
4
5
6
7
8
double MachineZero(){
    double u,v=1;
    do{
         u=v;
         v/=2;
    }while (u+1>1);
    return u;
}
Если можно, то поподробней. Как я понимаю, В данном случае мы работает с двоичной системой исчисления с типом double, где его min: 1.7e-308, а max: 1.7e+308. И получается мы должны как-то взять максимальный...(тут даже не знаю что спросить, т.к. хз)
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:57 #10
на практике это значение 5.4 е-20 хотя должно было бы быть по меньше
0
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 20:00  [ТС] #11
Цитата Сообщение от Nixy Посмотреть сообщение
на практике это значение 5.4 е-20 хотя должно было бы быть по меньше
Не понял, для какого типа данных вы имели ввиду данное число? + если не затруднит, то объясните про максимальную точность(саму идею желательно, чтобы мне понять как и что, да и почему)
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 20:05 #12
для типа double 5.4 е-20 машиной воспринимается уже как 0, если вы внимательно взгляните на код, то условие выхода из цикла do while именно если у меня 1+u<=1 так как u >0 , то меньше 1 мы не получим результат только если u будет равно машинному 0 , для типа dobule самое ближайшее получается
5.4 е-20 , числа меньше практически не влияют на результат
1
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 20:50  [ТС] #13
Цитата Сообщение от Nixy Посмотреть сообщение
для типа double 5.4 е-20 машиной воспринимается уже как 0, если вы внимательно взгляните на код, то условие выхода из цикла do while именно если у меня 1+u<=1 так как u >0 , то меньше 1 мы не получим результат только если u будет равно машинному 0 , для типа dobule самое ближайшее получается
5.4 е-20 , числа меньше практически не влияют на результат
Получается надо выдернуть число перед u(если u=0, то перед нулём было нормальное число, которое нам и нужно). Как это сделать?
0
Nixy
ComfyMobile
400 / 281 / 8
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 21:16 #14
сравнивай с u если меньше либо рано то прекращай считать
1
aleksand
21 / 9 / 2
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 21:23  [ТС] #15
Цитата Сообщение от Nixy Посмотреть сообщение
сравнивай с u если меньше либо рано то прекращай считать
Вот как реализовал, но всё равно выводит нули. Может дело в том, что значение гораздо меньше чем 0.000000?
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
#include <stdio.h>
#include <iostream>
 
double MachineZero();
 
int main()
{
    double x;
    x = MachineZero();
    printf("%f\n", x);
 
    system("pause");
    return 0;
}
 
double MachineZero(){
    double u,v=1;
    do{
         v = v/2;
         if(v=0) break;
         u=v;
 
    }while (u+1>1);
    return u;
}
0
08.10.2012, 21:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2012, 21:23
Привет! Вот еще темы с ответами:

Сумма ряда - C++
Здравствуйте! Кто подскажет как правильно записать код для вычисления суммы ряда например : С_n=1/√(C_(n-1) )+1; при заданном первом...

Сумма ряда - C++
#include &lt;iostream.h&gt; #include &lt;math.h&gt; void main() { const float eps=0.001; int n=0; float S=0,a=1,x,p; cout&lt;&lt;&quot;Введите...

сумма ряда - C++
Вычислить значение функции при помощи суммы ряда с точностью e. Сравнить полученное значение суммы с результатом вычисления стандартной...

Сумма ряда - C++
Нужно вычислить сумму ряда от n=1, до M. Ʃ(cos(n)/n!) Вот что у меня получилось, помогите исправить. #include &lt;iostream.h&gt; #include...


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

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

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