Как печатать долго? - PullRequest
       28

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

48 голосов
/ 19 июня 2011

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

#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);
    }
}

Ответы [ 4 ]

60 голосов
/ 19 июня 2011

%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);

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

3 голосов
/ 19 июня 2011
  • Ваш оператор 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().

0 голосов
/ 29 декабря 2017
    // acos(0.0) will return value of pi/2, inverse of cos(0) is pi/2 
    double pi = 2 * acos(0.0);
    int n; // upto 6 digit
    scanf("%d",&n); //precision with which you want the value of pi
    printf("%.*lf\n",n,pi); // * will get replaced by n which is the required precision
0 голосов
/ 19 июня 2011

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

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

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

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

...