возникли проблемы с получением правильного вывода из формулы аппроксимации в C - PullRequest
0 голосов
/ 03 февраля 2019
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double get_Pi(double accuracy)
{
    double Pi_estimate = 0;
    double increment = 0;
    double i = 0;
    int s = -1;


      while(fabs(increment) > accuracy)
     {

            increment = s*(1/(2*i+1));
              Pi_estimate = Pi_estimate + increment;
             s = -s;
             i++;
       }

       double offset = 1.0;
       Pi_estimate = Pi_estimate + offset;
       return 4*Pi_estimate;
       }



 int main()
{
   double accuracy;
     printf("\nhow accurate do you want Pi? ");
       scanf("%lf", &accuracy);
         double approx = get_Pi(accuracy);
       printf("%.10lf", approx);
        return 0;
      }

При вводе определенного десятичного числа вы должны получить пи до + или - точность, которую вы ввели, но на выходе всегда 4.00000.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Этот вопрос очень похож на Приближение C ++ Pi с использованием формулы Лейбница , что, я считаю, именно то, что вы ищете (несмотря на то, что это вопрос C ++).

Ваш цикл whileникогда не входит, так как это условие не может быть выполнено, если точность не отрицательна (0> точность), поэтому вы получите результат (Pi_estimate = 1) * 4 = 4

0 голосов
/ 03 февраля 2019

Вы начинаете с 0 вместо 1 и добавляете вместо вычитания в знаменатель вашего термина, вы вычисляете новое значение increment, используя целочисленные операции вместо плавающей запятой, и ваш цикл while никогдавводится, потому что increments начинается с 0.

Правильная формула: pi / 4 = сумма (k-> inf) ((-1) ^ (k + 1)) / (2k-1)

Таким образом, вы бы сделали это как:

double get_Pi(double accuracy)
{
    double Pi_estimate = 0;
    double increment;
    double i = 1;    // start at 1
    int s = 1;       // start with positive factor

    do {    // do the check at the bottom instead of the top
        increment = s*(1.0/(2.0*i-1));    // use floating point constants to prevent integer division
        Pi_estimate = Pi_estimate + increment;
        s = -s;
        i++;
    } while(fabs(increment) > accuracy);

    // no need to add an offset
    return 4*Pi_estimate;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...