циклы — функция для вычисления числа Пи с использованием ряда Тейлора в переполнении стека

Так что я не понимаю, почему мой код не работает, по сути, функция, которую я пишу, вычисляет оценку для Pi с использованием ряда Тейлора, он просто вылетает всякий раз, когда я пытаюсь запустить программу.

вот мой код

#include <iostream>
#include <math.h>
#include <stdlib.h>
using namespace std;

double get_pi(double accuracy)
{
double estimate_of_pi, latest_term, estimated_error;
int sign = -1;
int n;

estimate_of_pi = 0;
n = 0;

do
{
sign = -sign;
estimated_error = 4 * abs(1.0 / (2*n + 1.0));  //equation for error
latest_term = 4 * (1.0 *(2.0 * n + 1.0));      //calculation for latest term in series
estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
n = n + 1;                                     //changing value of n for next run of the loop
}
while(abs(latest_term)< estimated_error);

return get_pi(accuracy);

}

int main()
{
cout << get_pi(100);
}

логика кода следующая:

  1. определить все переменные
  2. установить оценку пи равной 0
  3. рассчитать член из ряда Тейлора и вычислить ошибку в
    этот термин
  4. затем он добавляет последний термин к оценке пи
  5. Затем программа должна обработать следующий член в ряду и ошибку в нем и добавить его к оценке числа pi, пока не будет выполнено условие в операторе while.

Спасибо за любую помощь, которую я могу получить

0

Решение

В вашей функции есть несколько ошибок. Смотрите мои комментарии со строками, начинающимися с «// NOTE:».

double get_pi(double accuracy)
{
double estimate_of_pi, latest_term, estimated_error;
int sign = -1;
int n;

estimate_of_pi = 0;
n = 0;

do
{
sign = -sign;

//NOTE: This is an unnecessary line.
estimated_error = 4 * abs(1.0 / (2*n + 1.0));  //equation for error

//NOTE: You have encoded the formula incorrectly.
// The RHS needs to be  "sign*4 * (1.0 /(2.0 * n + 1.0))"//                       ^^^^          ^
latest_term = 4 * (1.0 *(2.0 * n + 1.0));      //calculation for latest term in series
estimate_of_pi = estimate_of_pi + latest_term; //adding latest term to estimate of pi
n = n + 1;                                     //changing value of n for next run of the loop
}

//NOTE: The comparison is wrong.
// The conditional needs to be "fabs(latest_term) > estimated_error"//                              ^^^^             ^^^
while(abs(latest_term)< estimated_error);

//NOTE: You are calling the function again.
// This leads to infinite recursion.
// It needs to be  "return estimate_of_pi;"return get_pi(accuracy);
}

Кроме того, вызов функции в main неправильно. Это должно быть:

get_pi(0.001)

чтобы указать, что если абсолютное значение слагаемого меньше 0,001, функция может вернуться.

Вот обновленная версия функции, которая работает для меня.

double get_pi(double accuracy)
{
double estimate_of_pi, latest_term;
int sign = -1;
int n;

estimate_of_pi = 0;
n = 0;

do
{
sign = -sign;
latest_term = sign * 4 * (1.0 /(2.0 * n + 1.0));  //calculation for latest term in series
estimate_of_pi += latest_term;                    //adding latest term to estimate of pi
++n;                                              //changing value of n for next run of the loop
}
while(fabs(latest_term) > accuracy);

return estimate_of_pi;
}
1

Другие решения

Ваше возвращение заявление может быть причиной.

Попытайтесь возвратить «measure_of_pi» вместо get_pi (точность).

0

Ваше условие разрыва может быть переписано как

2*n + 1 < 1/(2*n + 1)     =>   (2*n + 1)^2 < 1

и это никогда не будет true за любой позитив n, Таким образом, ваш цикл никогда не закончится. После исправления вы должны изменить оператор возврата на

return estimated_error;

В настоящее время вы вызываете функцию рекурсивно без конца (при условии, что вы исправили условие остановки).

Более того, у вас есть sign и параметр accuracy что вы не используете вообще в расчете.

Мой совет для таких итераций — всегда разбивать максимальное количество итераций. В этом случае вы знаете, что он сходится (при условии, что вы исправите математику), но в целом вы никогда не можете быть уверены, что ваша итерация сходится.

0
По вопросам рекламы [email protected]