Аппроксимация бесконечного ряда числа pi в C не заканчивается - PullRequest
0 голосов
/ 06 ноября 2018

Вот мой код, при использовании операторов print он представлял собой бесконечный цикл:

некоторые потенциальные проблемы, которые я могу устранить, это целочисленное деление и, возможно, выяснение, завершается ли алгоритм, и если он всегда имеет правильный вывод, возможно, существует некоторая особенность языка C, которую я не понимаю, вызывающая эту проблему?

Насколько я понимаю, когда сумма стремится к отрицательной бесконечности, это приведет к тому, что оператор break будет запущен, завершив алгоритм, как только он достигнет аппроксимации точности эпсилона.

#include <stdio.h>

int main()
{

  double pi, sum, epsilon;
  long long i=1;
  long long max = 2147483647;
  printf("Pleas enter the desired accuracy epsilon : ");
  scanf("%f", &epsilon);
  while (i<max){
    if (i%2 == 0){
      sum = -4.0/(2.0*i-1);
    }else if (i%2 ==1){
      sum = (4.0/(2.0*i-1));
    }
    if (sum < epsilon){
      break;
    }
    pi += sum;
  }
  printf("The value of pi approximated to epsion : %f is %f\n", epsilon, pi);
  return 0;
}

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Вам необходимо увеличить i значение в цикле while.

Ваше условие зацикливания while(i < max) всегда выполняется (бесконечный цикл). Поэтому значение i или max должно быть изменено внутри цикла, чтобы когда-либо завершать цикл.

0 голосов
/ 06 ноября 2018

Ваш код имеет неопределенное поведение:

scanf("%f", &epsilon);

scanf %f занимает float *, а не double *. Правильный формат для double *: %lf.


Ваше условие цикла while (i<max) эквивалентно while (1), поскольку ни i, ни max не изменяют свое значение внутри цикла.

Это также означает, что sum всегда 4:

sum = (4.0/(2.0*i-1));
// 4 / (2 * 1 - 1) = 4 / (2 - 1) = 4 / 1 = 4

pi += sum;

также имеет неопределенное поведение: pi неинициализировано.

0 голосов
/ 06 ноября 2018

Вы не увеличиваете значение i в цикле while. В результате его значение всегда остается равным 1.

Увеличение i после обработки до закрытия } цикла while.

Инициализируйте значения pi, sum, epsilon, чтобы вы не столкнулись с неопределенным поведением при попытке прочитать их значения в первый раз.

Кроме того, с включенными правильными параметрами (-Wall с GCC) компилятор предупредит вас, что вы пытаетесь прочитать float в double.

warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=]

   scanf("%f", &epsilon);

          ~^   ~~~~~~~~

Таким образом, вы должны использовать правильный спецификатор преобразования: %lf вместо %f в вашем scanf выражении.

Если вы не очень точны в отношении числа 2147483647 и просто хотите получить большое значение, вы также можете использовать ULLONG_MAX (из limits.h) для инициализации max вместо жесткого кодирования значения.

...