|
Число слагаемых |
Полученное значение Free Pascal |
Полученное значение C++ |
A C++ |
є, % |
|
|
n = 10 |
3,2323158094 |
3,1415905109 |
0,0000021427 |
0,0001 |
|
|
n = 100 |
3,1514934011 |
3,1415926536 |
0,0000000000 |
0,0000 |
|
|
n = 1000 |
3,1425916543 |
3,1415926536 |
0,0000000000 |
0,0000 |
|
|
n = 10 000 |
3,1416926436 |
3,1415926536 |
0,0000000000 |
0,0000 |
|
|
n = 100 000 |
3,1416026535 |
3,1415926536 |
0,0000000000 |
0,0000 |
|
|
n = 1 000 000 |
3,1415946536 |
3,1415926536 |
0,0000000000 |
0,0000 |
Реализация алгоритма Мадхавы в С++ приводит к более точным результатам, чем предыдущие расчеты и за меньшее количество действий (табл. 4).
Таблица 4 Сравнение времени вычисления числа Пи с помощью ряда Мадхавы
|
Число слагаемых |
Полученное значение C++ |
t C++ |
Полученное значение C++ OpenMp |
t C++ OpenMp |
|
|
n = 10 |
3,1415905109 |
0,000029 |
3,1415905109 |
0,039706 |
|
|
n = 100 |
3,1415926536 |
0,000023 |
3,1415926536 |
0,000021 |
|
|
n = 1000 |
3,1415926536 |
0,000281 |
3,1415926536 |
0,000206 |
|
|
n = 10 000 |
3,1415926536 |
0,003524 |
3,1415926536 |
0,002405 |
|
|
n = 100 000 |
3,1415926536 |
0,036854 |
3,1415926536 |
0,021092 |
|
|
n = 1 000 000 |
3,1415926536 |
0,355709 |
3,1415926536 |
0,206818 |
Так как вычисляемое значение числа Пи достигает точности 10-10 при n = 100, можно сделать вывод о быстрой сходимости ряда. Время на вычисления увеличивается пропорционально числу слагаемых, но при параллельных вычислениях данный показатель значительно меньше. Получается, что точное значение (абсолютная ошибка < 10-10) можно вычислить за t C++ = 0,000023 с и t C++ openMp = 0,000021 c.
И в целом при использовании ряда Мадхавы, за исключением n = 10, времени на расчеты при использовании технологии параллельного программирования тратится меньше, чем при классических методах.
3. Рассмотрим результаты вычислений, полученные с помощью ряда Нилаканта (табл. 5).
Фрагмент листинга кода, реализующий вычисление числа Пи через ряд Нилаканта
void task_3(int n)
{
double pi = 3.0;
int znak = 1;
int i;
int z = 1;
double start, end;
start = omp_get_wtime();
#pragma omp parallel reduction(+:pi)
{
#pragma omp for
for (i = 2; i <= ; i += 2)
{
pi += (4*z) / (i * (i + 1.0) * (i + 2.0)); z = -z;
} }
end = omp_get_wtime();
printf("Значение pi для первых %d слагаемых, используя ряд Нилаканта:%.10f\n",n, pi); printf("Время: %.6f \n", end - start);
}
Таблица 5 Вычисление числа Пи с помощью ряда Нилаканта в C++
|
Число слагаемых |
Полученное значение Free Pascal |
Полученное значение C++ |
A C++ |
e, % |
|
|
n = 10 |
3,2323158094 |
3,1427128427 |
0,0011201891 |
0,0357 |
|
|
n = 100 |
3,1514934011 |
3,1415907698 |
0,0000018838 |
0,0001 |
|
|
n = 1000 |
3,1425916543 |
3,1415926516 |
0,0000000020 |
0,0000 |
|
|
n = 10 000 |
3,1416926436 |
3,1415926536 |
0,0000000000 |
0,0000 |
|
|
n = 100 000 |
3,1416026535 |
3,1415926536 |
0,0000000000 |
0,0000 |
|
|
n = 1 000 000 |
3,1415946536 |
3,1415926536 |
0,0000000000 |
0,0000 |
Как и в предыдущем случае, реализация данного алгоритма более эффективна в среде Visual Studio с помощью языка C++ (табл. 6).
Относительно времени вычисления ряд Нилаканта - достаточно быстрый. Затрачивается 0,000057 с, но при работе с 10 000 слагаемыми. При этом в ряде Мадхавы суммируется только 100 слагаемых и на эти вычисления тратится 0,000021 с. При вычислении по формуле Нилаканта технологии параллельного программирования позволяют сэкономить время при n > 10 000 слагаемых.
Таблица 6 Сравнение времени вычисления числа Пи с помощью ряда Нилаканта
|
Число слагаемых |
Полученное значен. C++ |
t C++ |
Полученное значение ЬDenMь |
tC++ OpenMp |
|
|
n = 10 |
3,1427128427 |
0,000000 |
3,1427128427 |
0,002104 |
|
|
n = 100 |
3,1415907698 |
0,000001 |
3,1415907698 |
0,000022 |
|
|
n = 1000 |
3,1415926516 |
0,000010 |
3,1415926516 |
0,000016 |
|
|
n = 10 000 |
3,1415926536 |
0,000100 |
3,1415926536 |
0,000057 |
|
|
n = 100 000 |
3,1415926536 |
0,001007 |
3,1415926536 |
0,000617 |
|
|
n = 1 000 000 |
3,1415926536 |
0,011177 |
3,1415926536 |
0,006506 |
4. Рассмотрим результаты вычислений, полученные с помощью формулы Эйлера (табл. 7).
Фрагмент листинга кода, реализующий вычисление числа Пи через ряд Эйлера
void task_4(int n)
{
double pi = 0; double start, end; start = omp_get_wtime();
#pragma omp parallel reduction(+:pi)
{
#pragma omp for
for (int i = 0; i < ; i++)
{
pi = pi + 1 / pow(i + 1, 2);
}
}
pi = sqrt(6 * pi); end = omp_get_wtime();
printf("Значение pi для первых %d слагаемых по формуле Эйлера: %.10f \n", г, pi);
printf("Время: %.6f \n", end - start);
}
Таблица 7 Вычисление числа Пи с помощью формулы Эйлера в C++
|
Число слагаемых |
Полученное знач. Free Pascal |
Полученное значение C++ |
A C++ |
є, % |
|
|
n = 10 |
3,2323158094 |
3,0493616360 |
0,0922310176 |
2,9358 |
|
|
n = 100 |
3,1514934011 |
3,1320765318 |
0,0095161218 |
0,3029 |
|
|
n = 1000 |
3,1425916543 |
3,1406380562 |
0,0009545974 |
0,0304 |
|
|
n = 10 000 |
3,1416926436 |
3,1414971639 |
0,0000954897 |
0,0030 |
|
|
n = 100 000 |
3,1416026535 |
3,1415831043 |
0,0000095493 |
0,0003 |
|
|
n = 1 000 000 |
3,1415946536 |
3,1415916987 |
0,0000009549 |
0,0000 |
Используя формулу Эйлера, даже при больших n не удалось вычислить число Пи с точностью 10-10. Так как требуемая точность не достигнута, проводить детальный анализ времени вычисления бессмысленно. Но в целом видна следующая тенденция: время при использовании технологии OpenMP меньше, чем в расчетах обычным способом.
5. Рассмотрим результаты вычислений, полученные с помощью формулы Валлиса (табл. 8).
Фрагмент листинга кода, реализующий вычисление числа Пи через формулу Валлиса
void task_5(int n)
{
double pi = 1; double start, end; start = omp_get_wtime();
#pragma omp parallel reduction(*:pi)
{
#pragma omp for
for (int i = 1; i <= n; i++)
{
pi = pi*pow(2 * i, 2) / ((2.0*i - 1)*(2.0*i + 1));
}
}
pi*= 2;
end = omp_get_wtime();
printf("Значение pi для первых %d слагаемых по формуле Валлиса: %.10f \n", г, pi);
printf("Время: %.6f \n", end - start);
}
Таблица 8 Вычисление числа Пи с помощью формулы Валлиса в C++
|
Число слагаемых |
Полученное знач. Free Pascal |
Полученное значение C++ |
A C++ |
є, % |
|
|
n = 10 |
3,2323158094 |
3,0677038066 |
0,0738888470 |
2,3520 |
|
|
n = 100 |
3,1514934011 |
3,1337874906 |
0,0078051630 |
0,2484 |
|
|
n = 1000 |
3,1425916543 |
3,1408077460 |
0,0007849076 |
0,0250 |
|
|
n = 10 000 |
3,1416926436 |
3,1415141187 |
0,0000785349 |
0,0025 |
|
|
n = 100 000 |
3,1416026535 |
3,1415847997 |
0,0000078539 |
0,0002 |
|
|
n = 1 000 000 |
3,1415946536 |
3,1415918682 |
0,0000007854 |
0,0000 |
Как и при использовании формулы Эйлера, даже при больших п не удалось вычислить число Пи с точностью 10-10. Как видно, явного преимущества технологии параллельного программирования в скорости вычисления методом Валлиса не дают. Это может быть связано с тем, что считается не сумма ряда, а произведение множителей.
Обсуждение
В ходе исследования были проведены практические вычисления числа Пи разными методами: Грегори-Лейбница, Мадхавы, Нилаканта, Эйлера, Валлиса - с использованием методов классического программирования и с применением технологии параллельного программирования OpenMP.
Анализ инструментов вычисления показывает, что среда Visual Studio, и в частности язык C++, дают одинаковую точность вычисления, независимо от использования методов параллельного программирования или проведения расчетов только классическими методами.
Требуемая точность 10-10 была достигнута только при использовании методов Мадхавы (п = 100) и Нилаканта (п = 10 000). Остальные способы даже при количестве слагаемых п = 106 не удовлетворяют заявленной точности.
Результаты вычислений при использовании технологии параллельного программирования и, только стандартных методов оказались абсолютно одинаковыми. А время вычисления в среднем при технологии OpenMP значительно меньше, особенно это заметно при увеличении числа слагаемых. При п > 100 метод Нилаканта и технология OpenMP дают самые быстрые расчеты (рис. 1).
Минимальное время вычисления числа Пи (( = 0,000021 с) получено по формуле Мадхавы при п = 100 и использовании технологии параллельного программирования OpenMP.
Заключение
В работе продемонстрировано использование технологии параллельного программирования OpenMP в вычислительной среде Visual Studio с помощью языка C++ при вычислении математической константы Пи с десятью знаками в дробной части. Показаны преимущества данной технологии: высокая точность вычислений по сравнению с другими инструментами, синхронизация полученных результатов в расчетах с использованием технологии параллельных вычислений и классических методов, увеличение скорости расчетов за счет экономии времени при распараллеливании. Все эти преимущества свидетельствуют о необходимости внедрения и использования технологий параллельных вычислений при обработке больших объемов данных и решении задач вычислительного характера.
число пи параллельный программирование
Список литературы
1. Зудин В. П. Развитие креативного мышления обучающихся с помощью нестандартных методов вычисления числа Пи // Информатика и образование. 2017. № 10. С. 26-37.
2. Коростелев С. П. Существенная коррекция значения числа Пи на основании абсолютно точных решений задач квадратуры круга и удвоения куба // Вестник науки и образования. 2019. № 15 (69). С. 6-16.
3. Коростелев С. П. Существенная коррекция значения числа Пи на основании абсолютно точных решений задач квадратуры круга и удвоения куба с прибавлением математического обоснования необходимости в такой коррекции // Вестник науки и образования. 2019. № 16. С. 5-21.
4. Чепасов В. И., Токарева М. А., Буреш О. В. Вычисление числа Пи методом касательных в длинной арифметике. Оренбург : Изд-во ОГУ, 2011. 119 с.
5. Сенатов В. С., Савостьянова И. Л. Вычисление числа п с помощью геометрической вероятности // Актуальные проблемы авиации и космонавтики. 2018. Т. 2, № 4 (14). С. 362-364.
6. Луценко Е. В. Исследование символьных и цифровых рядов методами теории информации и АСК-анализа (на примере числа Пи с одним миллионом знаков после запятой) // Политематический сетевой электронный научный журнал Кубанского государственного аграрного университета. 2014. № 99. С. 73-100.
7. Андросенко В. А. Мера иррациональности числа // Известия Российской академии наук. Серия математическая. 2015. Т. 79, № 1. С. 3-20.
8. Selenskih V. N. Physical method of determining the exact Pi number // Eastern European Scientific Journal. 2013. № 6. P. 100-104.
9. Lewis H. Calculating Pi (п) // The Institute of Mathematics and its Applications. URL: https://www.mathscareers.org.uk/calculating-pi/
10. Sparavigna A. C. Number Pi from the decorations of ancient artifacts // Archaeoastronomy and Ancient Technologies. 2013. Vol. 1, № 2. С. 40-47.
11. Arndt J., Haenel C. Pi. Algorithmen, Computer, Arithmetik. Springer, 2000, 264 p.
12. Bailey D., Borwein J. The next generation a sourcebook on the recent history of Pi and its computation. Springer, 2016. 507 p.
13. Agarwal R. P., Agarwal H., Sen S. K. Birth, growth and computation of Pi to ten trillion digits // Advances in Difference Equations. 2013. № 1. P. 100. URL: https://advancesindifferenceequations.springeropen.com/track/pdf/10.1186/1687-1847- 2013-100.pdf
14. Графова А. А. Число Пи: краткий обзор свойств и нерешенные проблемы // Проблемы современных интеграционных процессов и поиск инновационных решений : сб. ст. Междунар. науч.-практ. конф. (Стерлитамак, 2020). Уфа : Агентство международных исследований, 2020. С. 15-18.
15. Кормилицына Т. В. Обучение программированию в языках сверхвысокого уровня на примере входных языков систем компьютерной математики // Учебный эксперимент в образовании. 2017. № 1 (81). С. 41-45.
16. Бакаева О. А. Анализ процессов компьютерного моделирования вычисления числа Пи методом Монте-Карло // Вестник Чувашского университета. 2018. № 3. С. 151-162.
17. Окань С. В. Изучение влияния распараллеливания вычислений с использованием OPENMP // Совершенствование методологии и организации научных исследований в целях развития общества : сб. ст. по итогам Междунар. науч.-практ. конф. Стерлитамак : Агентство международных исследований, 2020. С. 173-176.