Так что я не понимаю, почему мой код не работает, по сути, функция, которую я пишу, вычисляет оценку для 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);
}
логика кода следующая:
Спасибо за любую помощь, которую я могу получить
В вашей функции есть несколько ошибок. Смотрите мои комментарии со строками, начинающимися с «// 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;
}
Ваше возвращение заявление может быть причиной.
Попытайтесь возвратить «measure_of_pi» вместо get_pi (точность).
Ваше условие разрыва может быть переписано как
2*n + 1 < 1/(2*n + 1) => (2*n + 1)^2 < 1
и это никогда не будет true
за любой позитив n
, Таким образом, ваш цикл никогда не закончится. После исправления вы должны изменить оператор возврата на
return estimated_error;
В настоящее время вы вызываете функцию рекурсивно без конца (при условии, что вы исправили условие остановки).
Более того, у вас есть sign
и параметр accuracy
что вы не используете вообще в расчете.
Мой совет для таких итераций — всегда разбивать максимальное количество итераций. В этом случае вы знаете, что он сходится (при условии, что вы исправите математику), но в целом вы никогда не можете быть уверены, что ваша итерация сходится.