Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296

Работа с обсчетом членов ряда потоками

04.10.2011, 01:02. Показов 2468. Ответов 21
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста разобраться.
Задача такая:
Обсчитать сумму ряда по частям, с помощью потоков. Каждый поток считает свою часть ряда, и в итоге главный поток возвращает всю сумму. Вроде бы все правильно, но почему криво считает.
К примеру:

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <iostream>
#include <wait.h>
#include <math.h>
using namespace std;
 
float calcSum(float);   // прототип функции вычисления суммы
int n = 0;              // количество потоков
 
struct thread_arg
{
    float sum;  // сумма
    int id;     // id потока
    int start;  
    int end;
    int kol;    // количество членов ряда, которые нужно обсчитать
};
// потоковая функция
void *thread_f (void *arg)
{
    struct thread_arg *targ = (struct thread_arg*) arg;
    int id_t = targ->id; // id текущего потока
    cout << "id-------------------------------------"<< id_t <<endl;
    float s = 0.0;
    for (int i=targ->start; i<targ->end; i++)
    {
        float a = i;
        float b = i+1;
        s += a/b;
    }
    targ->sum = s;
    cout <<"schital s "<< (targ->start) <<" po "<< (targ->end) <<endl;
    cout <<"summa chasti "<< targ->sum <<" moi id "<< id_t << endl;
}
 
int main() 
{
    struct thread_arg *targ1;
    
    cout << "Enter the amount of pthread" << endl;
    cin >> n;               // вводим кол-во потоков
    cout << "Entre the term amount value of sum" << endl;
    cin >> targ1->kol;      // вводим кол-во членов ряда
    
    int step = (targ1->kol-targ1->kol%n)/n; // вычисляем шаг
    int ost = targ1->kol%n;                 // вычисляем остаток
    
    int start = 0;      
    int end = step;
    
    pthread_t thread[n];
    thread_arg num[n];
    
    for (int i=0; i<=n, end<=targ1->kol; i++, start+=step, end+=step)
    { 
        num[i].id = i;        // передаем id потока
        num[i].start = start; // передаем начало части ряда
        num[i].end = end + 1; // передаем конец части ряда
    
        pthread_create(&thread[i], NULL, &thread_f, &num[i]);
    
        if (ost > 0)
        {
            start++;
            end++;
            ost--;
        }
        sleep(1);
    }
    float totalSum = 0.0;
    for (int i=0; i<n; i++)
    {
        pthread_join(thread[i],NULL);
        totalSum += num[i].sum;
    }
    cout << "summa "<< totalSum << endl; 
return 0;
}
Почему с 7го по 11й? Просто уже запутался... но спать нельзя.
Миниатюры
Работа с обсчетом членов ряда потоками  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2011, 01:02
Ответы с готовыми решениями:

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

Определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда
Помогите с программами нужны готовые програмные коды. Темы циклы: 1) Определить число членов ряда, необходимых для расчета с...

Определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда
определить число членов ряда, необходимых для расчета с заданной погрешностью суммы членов ряда: 1-1/3+1/5-1/7+…..: (-1)^N/(2*N+1);...

21
 Аватар для Visary_Master
17 / 18 / 1
Регистрация: 01.12.2010
Сообщений: 296
06.10.2011, 11:46  [ТС]
Теперь другая проблема, просто написал тест:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main()
{
    float s = 0.0;
    int n = 10  ;
    for (float i=0; i<n; i++)
    {
        
        s += i/(i+1.0);
    }
    cout << s << endl;
    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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <wait.h>
#include <math.h>
using namespace std;
 
float calcSum(float);   // прототип функции вычисления суммы
int n = 0;              // количество потоков
 
struct thread_arg
{
    float sum;  // сумма
    int id;     // id потока
    int start;  
    int end;
    int kol;    // количество членов ряда, которые нужно обсчитать
};
 
// потоковая функция
void *thread_f (void *arg)
{
    struct thread_arg *targ = (struct thread_arg*) arg;
    int id_t = targ->id; // id текущего потока
    cout << "id-------------------------------------"<< id_t <<endl;
    float s = 0.0;
    for (int i=targ->start; i<targ->end; i++)
    {
        float a = i;
        float b = i+1;s 
        s += a/b;
    }
    targ->sum = s;
    cout <<"schital s "<< (targ->start) <<" po "<< (targ->end) <<endl;
    cout <<"summa chasti "<< targ->sum <<" moi id "<< id_t << endl;
}
 
int main() 
{
    struct thread_arg targ1;
    
    cout << "Enter the amount of pthread" << endl;
    cin >> n;               // вводим кол-во потоков
    cout << "Entre the term amount value of sum" << endl;
    cin >> targ1.kol;       // вводим кол-во членов ряда
    
    int step = targ1.kol / n;
    int ost = targ1.kol % n;
    
    int start = 0;      
    int end = step-1;
    
    pthread_t thread[n];
    thread_arg num[n];
    
    for (int i=0; i<=n, end<=targ1.kol; i++, start+=step, end+=step)
    { 
    
        num[i].id = i;  
        if (ost > 0)
        { 
            end++;
            num[i].end = end; // передаем конец части ряда 
            num[i].start = start; // передаем начало части ряда
            pthread_create(&thread[i], NULL, &thread_f, &num[i]);
            start++;
            ost--;
        }
        else
        {
            num[i].start = start; // передаем начало части ряда
            num[i].end = end; // передаем конец части ряда
            pthread_create(&thread[i], NULL, &thread_f, &num[i]);
        }
        sleep(1);
    }
    float totalSum = 0.0;
    
    for (int i=0; i<n; i++)
    {
        totalSum += num[i].sum;
    }
    
    for (int i=0; i<n; i++)
    {
        pthread_join(thread[i],NULL);
 
    }
    cout << "summa "<< totalSum << endl; 
return 0;
}
Помогите пожалуйста разобраться, где я ошибся?
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
07.10.2011, 02:08
Работа с обсчетом членов ряда потоками
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.10.2011, 02:08

Выполнить суммирование членов бесконечного ряда по точности та по колическву членов ряда
Выполнить суммирование членов бесконечного ряда по точности та по колическву членов ряда

Найти сумму четных членов ряда, и произведение нечетных членов ряда
Почему не работает,кто объяснит? Ввести массив А(N) из членов ряда А(i) = i ^ (1 / 3) Число элементов ограничены по условию А(I)...

Найти сумму четных членов ряда и произведение нечетных членов ряда
Пожалуйста, помогите. Задача такая:ввести массив A(N) из члена ряда A(I)=I^(1/3).Число элементов ограничены по условию A(I)&lt;=M,где...

Подсчитать сумму членов ряда и сумме первых 10 членов ряда
Для ряда, члены которого вычисляются по формуле(ниже формула). Подсчитать сумму членов ряда с точностью до 0.000001 и сумму первых 10...

Подсчитать сумму членов ряда с точностью до 0.000001 и сумму первых 10 членов ряда
Добавлено через 10 часов 32 минуты Для ряда, члены которого вычисляются по формуле, соответствующей Вашему индивидуальному заданию,...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
[golang] Конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов.
alhaos 10.06.2026
Задача Реализовать конкурентный fetcher с ограничением максимального количества одновременных HTTP запросов. Сигнатура func Fetch(urls string, maxConcurrent int) Result Пример urls :=. . .
[golang] Состояние гонки (race condition)
alhaos 10.06.2026
Состояние гонки (race condition) Состояние гонки (Race Condition) — это ошибка, возникающая при одновременном доступе нескольких горутин к одним и тем же данным без должной синхронизации. При этом. . .
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru