Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185

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

08.10.2012, 18:26. Показов 7137. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.10.2012, 18:26
Ответы с готовыми решениями:

Точность ряда
Всем привет. Есть задание: Вычислить и вывести на экран в виде таблицы значения функции, с заданной с помощью ряда Тейлора, на...

Определить количество членов ряда, которые дают заданную точность
Известно равенство: $$\prod_{k=2}^{\infty} \left(1 - \frac{1}{k^{2}}\right)=\frac{1}{2}$$ Сколько сомножителей нужно взять в...

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

21
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 18:34
сравнивай по абсолютному значению
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 18:42  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
сравнивай по абсолютному значению
Это как? Почему нельзя сравнивать так?
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 18:48
сравнивать можно но у тебя члены ряда могут быть и положительными, и отрицательными, в частности 5 член отрицательный и он меньше погрешности она положительна, но по абсолютному значению погрешность будет меньше , для нахождения абсолютного значения используй функцию fabs();
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 18:56  [ТС]
Цитата Сообщение от 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
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:04
ну для начала еще неплохо былобы засунуть проверку внтурь цикла
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
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 19:24  [ТС]
Цитата Сообщение от 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
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:32
она зависит от типа вроде, я сам могу ошибатся но вот этот код покажет машинный 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
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 19:42  [ТС]
Цитата Сообщение от 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
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 19:57
на практике это значение 5.4 е-20 хотя должно было бы быть по меньше
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 20:00  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
на практике это значение 5.4 е-20 хотя должно было бы быть по меньше
Не понял, для какого типа данных вы имели ввиду данное число? + если не затруднит, то объясните про максимальную точность(саму идею желательно, чтобы мне понять как и что, да и почему)
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 20:05
для типа double 5.4 е-20 машиной воспринимается уже как 0, если вы внимательно взгляните на код, то условие выхода из цикла do while именно если у меня 1+u<=1 так как u >0 , то меньше 1 мы не получим результат только если u будет равно машинному 0 , для типа dobule самое ближайшее получается
5.4 е-20 , числа меньше практически не влияют на результат
1
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 20:50  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
для типа double 5.4 е-20 машиной воспринимается уже как 0, если вы внимательно взгляните на код, то условие выхода из цикла do while именно если у меня 1+u<=1 так как u >0 , то меньше 1 мы не получим результат только если u будет равно машинному 0 , для типа dobule самое ближайшее получается
5.4 е-20 , числа меньше практически не влияют на результат
Получается надо выдернуть число перед u(если u=0, то перед нулём было нормальное число, которое нам и нужно). Как это сделать?
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 21:16
сравнивай с u если меньше либо рано то прекращай считать
1
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 21:23  [ТС]
Цитата Сообщение от 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
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 21:39
да , а у тебя в этом была проблема? замени на std::cout<< либо смотри еше параметры printf
исходя из справки вместо %f используй %е
и да , зачем тебе вот эта строка if(v=0) break; ? и тем более у тебя не сравнение идет а присвоение!!!

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
double MachineZero(){
    double v,u=1;
    do{
        v=u;
        u/=2;
    }while (u);
    return v;
}
вот так лучше работает
1
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 22:05  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
да , а у тебя в этом была проблема? замени на std::cout<< либо смотри еше параметры printf
исходя из справки вместо %f используй %е
и да , зачем тебе вот эта строка if(v=0) break; ? и тем более у тебя не сравнение идет а присвоение!!!

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
double MachineZero(){
    double v,u=1;
    do{
        v=u;
        u/=2;
    }while (u);
    return v;
}
вот так лучше работает
получается минимальное значение типа double это 4.94065e-324(это вроде бы больше чем 1.7e-308, т.к. 1.7 это минимум), а не 1.7e-308. Это я как понял такое встречается только на практике, но вот с чем это связано? (не с проста же в книжках пишут значение 1.7e-308)
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 22:12
вы что то путаете, начиная с того что 4.94065e-324 это меньше чем 1.7e-308, а во вторых у нас диапозон значений идет с минусовых и скорее всего -1.7 e308 , 1.7 e308 вот это диапазон
а минусовые степени это оч малые значения приближающиеся к 0
1
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
08.10.2012, 22:23  [ТС]
Цитата Сообщение от Nixy Посмотреть сообщение
вы что то путаете, начиная с того что 4.94065e-324 это меньше чем 1.7e-308, а во вторых у нас диапозон значений идет с минусовых и скорее всего -1.7 e308 , 1.7 e308 вот это диапазон
а минусовые степени это оч малые значения приближающиеся к 0
На счёт диапазона данных, то он такой: 1.7E-308-1.7E+308. Соответственно возникает вопрос, если 4.94065e-324 меньше чем 1.7e-308, то как оно вообще находится в этом диапазоне данных?
Источник: http://citforum.ru/programming... _017.shtml
0
ComfyMobile
 Аватар для Nixy
401 / 282 / 34
Регистрация: 24.07.2012
Сообщений: 916
08.10.2012, 23:21
Цитата Сообщение от aleksand Посмотреть сообщение
На счёт диапазона данных, то он такой: 1.7E-308-1.7E+308. Соответственно возникает вопрос, если 4.94065e-324 меньше чем 1.7e-308, то как оно вообще находится в этом диапазоне данных?
Источник: http://citforum.ru/programming... _017.shtml
что очень важно опять же для Borland C++ 4.5 из источника , у меня Embarcadero RAD Studio XE 2 2010 года стандарты меняются, и каким то образом возможность хранить еще меньшие значения получается, мне эти шаманства не ведомы, но тем не менее , для вашей задачи , такая ошибка не играет роли, обычно берут несколько первых членов ряда, 4-6 остальные уже мало влияют на ситуацию, поэтому ошибка порядка малости 4-6 вполне допустимы, не надо считать машиный 0, это я просто для примера привел

почитай википедию там пишут про диапазон , я не вчитывался , но то что тебя интересует там вроде есть
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2012, 23:21
Помогаю со студенческими работами здесь

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

Найти номер члена ряда, начиная с которого сумма ряда будет больше заданного А
Всем привет! Мы еще даже не изучали эту тему с &quot;Суммой ряда&quot;, а просят найти Переработать программу для решения следующих задач ...

Сумма ряда с точностью до члена ряда
Найти сумму ряда с точностью до члена ряда, меньшего ε(задается с клавиатуры) для заданного значения x(любое число) ...

Вычислить сумму ряда с точность Е
Ребят помогите Вычислить сумму ряда с точностью E, общий член которого {a}_{n}=\frac{{(-1)}^{n-1}}{{n}^{n}}

Найти сумму ряда с точность 0.001
помогите найти найти сумму ряда с точность 0.001 !!! Когда я проверял сходится или расходится ряд (по коши) у меня получалось 1


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru