21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
1

Выводит #infoo при подсчёте суммы ряда

13.10.2012, 00:09. Показов 2296. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если я ввожу "x" очень большой(100 например), то программа не работает выводя кучу строк подряд что-то типа #infoo. При этом "e" может быть любым. Подскажите в чём дело? Как решить данную проблему?
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
#include <stdio.h>
#include <math.h>
 
int main()
{   
    double a, b, c, d, f, g ,h, m, i;
    float x, e;
    int n;
    h=0;
 
 
    printf("vvedite x\n");
    scanf("%f", &x);
    printf("vvedite e\n");
    scanf("%f", &e);
    for(n=1;;n++) {
    
        a=pow(-1.0, n); //степень 1
        b=pow(x, 2*n+1); // степень 2
        c=a*b; //произведение этих степеней
 
        d=1; // переменная для факториала
        f=2*n+1; //факториал какого числа считаем
        for(i=1; i<=f; i++) {
        d=d*i;
        }
 
        g=c/d; //результат ряда
 
        h=h+g;
        m = fabs(g);
        printf("%d. %f\n", n, g);
        
        if((int)e==(int)m && e>=(m-(int)m)) {
        printf("%f", h);
        break;
        }
        else if(e>0 && e>=m) {
        printf("%f", h);
        break;
        }
        
 
    }
 
    getchar();
    getchar();
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.10.2012, 00:09
Ответы с готовыми решениями:

Выводит крокозяблы при подсчёте ряда Тейлора
#include&lt;iostream.h&gt; #include&lt;math.h&gt; #include&lt;windows.h&gt; long double fact(int N) { if(N...

Найти ошибку при подсчете суммы ряда
Помогите найти ошибку, выдает неправильный результат. Задан массив z(m). Посчитать: #include...

Найти количество итераций при подсчете суммы ряда
Найти количество итераций при подсчете суммы ряда до того , как n-ый член суммы будет меньше...

Ошибка при подсчёте контрольной суммы
Всем здравствуйте. Вот функция, представленная производителем приборов для проверки правильности...

7
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.10.2012, 00:17 2
Включайте отладчик и смотрите какая из функций или операций даёт результат #inf.
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
13.10.2012, 00:30  [ТС] 3
Цитата Сообщение от John Prick Посмотреть сообщение
Включайте отладчик и смотрите какая из функций или операций даёт результат #inf.
Был бы благодарен, если бы объяснили подробно как это сделать на данном примере
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.10.2012, 00:56 4
Ну как в отладчике точки останова ставить и по шагам программу проходить знаете?
Если да - ставите точку останова, например, на первой операции цикла a=pow(-1.0, n); и далее идёте по шагам, наблюдая за изменением каждой переменной.
Правда, с циклами придётся возможно пройти его не один раз, прежде чем ошибка появится. Поэтому при первом "эксперименте" можно пропускать итерацию целиком (до той же точки останова в цикле) пока не проявится ошибка, затем уже локализовать место её возникновения.
1
10 / 10 / 3
Регистрация: 06.09.2012
Сообщений: 36
13.10.2012, 01:31 5
Цитата Сообщение от aleksand Посмотреть сообщение
Если я ввожу "x" очень большой(100 например), то программа не работает выводя кучу строк подряд что-то типа #infoo. При этом "e" может быть любым. Подскажите в чём дело? Как решить данную проблему?
Молодец! Конечно, до бесконечности считать всегда будет переполнение! Поставьте останов на цикл.

Ряд sin(x) начинается с нуля, а не с единицы. При правильной остановке Ваша программа (при замене n=1 на n=0) дает верный резулитат, т.е. sin(x) =)

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
#include <stdio.h>
#include <math.h>
#include <conio.h>
 
#define PI  3.14159
 
int main()
{
    //FILE* pf = fopen("Output.txt","w+");
 
    double a, b, c, d, f, g ,h, m, i;
    float x;
    int n;
    h=0;
 
 
    printf("vvedite x\n");
    scanf("%f", &x);
    for(n=0;;n++) {
    
        a=pow(-1.0, n); //степень 1
        b=pow(x, 2*n+1); // степень 2
        c=a*b; //произведение этих степеней
 
        d=1; // переменная для факториала
        f=2*n+1; //факториал какого числа считаем
        for(i=1; i<=f; i++) {
        d=d*i;
        }
 
        g=c/d; //результат ряда
 
        h=h+g;
        m = fabs(g);
        printf("%d. %f, h=%f\n", n, g, h);
 
    }
 
    getchar();
    
}
Вывод sin π/2:

vvedite x
1.57
0. 1.570000, h=1.570000
1. -0.644982, h=0.925018
2. 0.079491, h=1.004509
3. -0.004665, h=0.999843
4. 0.000160, h=1.000003
5. -0.000004, h=1.000000
6. 0.000000, h=1.000000
7. -0.000000, h=1.000000
8. 0.000000, h=1.000000
9. -0.000000, h=1.000000


P.S.:
Вот это непонятн чего изображено
C
1
2
3
4
5
6
7
8
if((int)e==(int)m && e>=(m-(int)m)) {
        printf("%f", h);
        break;
       }
        else if(e>0 && e>=m) {
        printf("%f", h);
        break;
        }
0
21 / 9 / 0
Регистрация: 18.06.2011
Сообщений: 185
13.10.2012, 13:49  [ТС] 6
Цитата Сообщение от tguglanaklona Посмотреть сообщение
Ряд sin(x) начинается с нуля, а не с единицы. При правильной остановке Ваша программа (при замене n=1 на n=0) дает верный резулитат, т.е. sin(x) =)
Здесь про sin вообще ничего нету)) Тут сумма ряда без sin
0
2277 / 1768 / 741
Регистрация: 27.07.2012
Сообщений: 5,251
13.10.2012, 14:09 7
Цитата Сообщение от aleksand Посмотреть сообщение
Тут сумма ряда без sin
Видимо, твой ряд является разложением в ряд функции sin. Наверное, это имел ввиду
tguglanaklona. Я не силён в рядах, не могу сказать точно, так ли это на самом деле. Грубо говоря, подставляя в ряд значение X и считая ряд до бесконечности получишь значение sin(X). Ну или значение той функции, разложение в ряд которой представлено у тебя.
В любом случае, ты должен контролировать переполнения (которые очень быстро возникают при расчёте факториалов), а также получения всяких недопустимых значений.
0
10 / 10 / 3
Регистрация: 06.09.2012
Сообщений: 36
13.10.2012, 15:24 8
Цитата Сообщение от John Prick Посмотреть сообщение
Видимо, твой ряд является разложением в ряд функции sin. Наверное, это имел ввиду
tguglanaklona. Я не силён в рядах, не могу сказать точно, так ли это на самом деле. Грубо говоря, подставляя в ряд значение X и считая ряд до бесконечности получишь значение sin(X). Ну или значение той функции, разложение в ряд которой представлено у тебя.
В любом случае, ты должен контролировать переполнения (которые очень быстро возникают при расчёте факториалов), а также получения всяких недопустимых значений.
Угу, так точно

Здесь про sin вообще ничего нету)) Тут сумма ряда без sin
Смотри сам. sin(1.57)≈1 в моем примере. Надо бы знать, че считаем. Так зачем e? =)
0
13.10.2012, 15:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2012, 15:24
Помогаю со студенческими работами здесь

Глюк маткада при подсчете суммы?
Собственно написал формулу многочлена Лагранжа, и при подсчете глюк (см. картинку)...

Объединить два одинаковых ID при подсчёте суммы заказа
Пишу триггер на подсчёт суммы заказа, таблица Purchase - таблица покупки, Order - детали покупки,...

Ошибка в результатах при подсчете суммы n-1 членов прогрессии
Проблема собственно вот в чем: разница в результатах при подсчете суммы n-1 членов прогрессии....

Ошибка при подсчете суммы четных цифр числа
Пытаюсь найти сумму четных цифр числа, но программа работает только если все цифры числа четные,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru