significa - voltear por el lado mas largo o mas corto
Cómo imprimir largo largo (4)
Estoy haciendo un programa que se aproxima a PI y trato de usar mucho tiempo, pero no funciona. Aquí está el código
#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);
}
}
En primer lugar,% d es para un int
Así que %1.16lld
no tiene sentido, porque% d es un número entero
Ese typedef que hagas, también es innecesario, usa el tipo directamente hacia adelante, hace un código mucho más legible.
Lo que desea usar es el tipo double
, para calcular pi y luego usar %f
o %1.16f
.
%lld
es la forma estándar de C99, pero eso no funciona en el compilador que estoy usando (mingw32-gcc v4.6.0). La forma de hacerlo en este compilador es: %I64d
Así que prueba esto:
if(e%n==0)printf("%15I64d -> %1.16I64d/n",e, 4*pi);
y
scanf("%I64d", &n);
La única forma que conozco de hacer esto de una manera completamente portátil es usar las definiciones en <inttypes.h>
.
En tu caso, se vería así:
scanf("%"SCNd64"", &n);
//...
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"/n",e, 4*pi);
Realmente es muy feo ... pero al menos es portátil.
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);
- Tu sentencia
scanf()
necesita usar%lld
. - Su bucle no tiene una condición de terminación.
Hay demasiados paréntesis y muy pocos espacios en la expresión
pi += pow(-1.0, e) / (2.0*e + 1.0);
- Usted agrega uno en la primera iteración del bucle, y luego a cero al valor de ''pi''; Esto no cambia mucho el valor.
- Debe usar un tipo de retorno explícito de
int
paramain()
. - En general, es mejor especificar
int main(void)
cuando ignora sus argumentos, aunque eso es menos una declaración categórica que el resto. - No me gusta la licencia explícita otorgada en C99 para omitir la devolución del final de
main()
y no la uso yo misma; Yo escriboreturn 0;
para ser explícito
Creo que todo el algoritmo es dudoso cuando se escribe usando long long
; el tipo de datos probablemente debería ser más bien long double
(con %Lf
para el formato scanf()
, y tal vez %19.16Lf
para los formatos printf()
.