Подтвердить что ты не робот

Как долго долго печатать

Я делаю программу, которая aproximate PI, и я пытаюсь использовать долгое время, но она не работает. Вот код

#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
    num pi;
    pi=0;
    num e, n;
    scanf("%d", &n);
    for(e=0; 1;e++){
      pi += ((pow((-1.0),e))/(2.0*e+1.0));
      if(e%n==0)
        printf("%15lld -> %1.16lld\n",e, 4*pi);
      //printf("%lld\n",4*pi);
    }
}
4b9b3361

Ответ 1

%lld является стандартным способом C99, но это не работает на компиляторе, который я использую (mingw32-gcc v4.6.0). Способ сделать это в этом компиляторе: %I64d

Итак, попробуйте следующее:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);

и

scanf("%I64d", &n);

Единственный способ, которым я знаю это, полностью переносимым образом - использовать определения в <inttypes.h>.

В вашем случае это будет выглядеть так:

scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);

Это действительно очень уродливо... но, по крайней мере, оно переносимо.

Ответ 2

  • Ваш оператор scanf() должен также использовать %lld.
  • В вашей петле нет условия завершения.
  • Слишком много скобок и слишком мало пробелов в выражении

    pi += pow(-1.0, e) / (2.0*e + 1.0);
    
  • Вы добавляете один на первую итерацию цикла, а затем нулевое значение "pi"; это не сильно меняет значение.
  • Вы должны использовать явный возвращаемый тип int для main().
  • В целом лучше всего указать int main(void), когда он игнорирует свои аргументы, хотя это меньше категориального утверждения, чем остальные.
  • Мне не нравится явная лицензия, предоставленная на C99, чтобы опустить возврат с конца main() и не использовать его самостоятельно; Я пишу return 0;, чтобы быть явным.

Я думаю, что весь алгоритм сомнительный при написании с использованием long long; тип данных, вероятно, должен быть больше похож на long double%Lf для формата scanf() и, возможно, %19.16Lf для форматов printf().

Ответ 3

    double pi = 2 * acos(0.0);
    int n;
    scanf("%d",&n); //precision with which you want the value of pi
    printf("%.*lf\n",n,pi);

Ответ 4

Прежде всего,% d для a int

Итак, %1.16lld не имеет смысла, потому что% d является целым числом

Этот typedef, который вы делаете, также не нужен, используйте тип прямо вперед, делает гораздо более читаемый код.

То, что вы хотите использовать, это тип double, для вычисления pi и затем используя %f или %1.16f.