Título: [C]Calcular pi Publicado por: HRSLASH en 10 Agosto 2010, 19:47 pm Hola gente!! dejo unos programitas que hice para calcular pi con distintas series infinitas.. y ya q los posteo aprovecho para dejar unas dudas q tengo..
Algoritmo Gottfried Wilhem von Leibniz = 4(1/1-1/3+1/5-1/7+1/9...) Código
Algoritmo John Wallis = 2 ( 2/1 x 2/3 x 4/3 x 4/5 x 6/5 x 6/7 ....) Código
Estos 2 funcionan bien pero me devuelven solo 16 decimales, desp de ese devuelve todo 0.. pq?? Algoritmo Leonhard Euler = 1 + 1/3 + 1x2 / 3x5 + 1x2x3 / 3x5x7 +.... Código
En este tengo el problema de q como se forman nº tan grandes no puedo hacer un bucle de mas de 100 vueltas y ademas no da el rtdo, no pude encontrarle solucion, creo q el codigo esta bien hecho.. Saludos! :D Título: Re: [C]Calcular pi Publicado por: leogtz en 10 Agosto 2010, 20:36 pm En el algoritmo "Algoritmo Gottfried Wilhem von Leibniz" corrigiendo errores, usando variables register y compilando "agresivamente" con gcc se puede calcular en unos 45 segundos a 32 decimales:
Código
Código: leo@lein:~/Escritorio/c_proyect/intgrande$ cat code.c Y este: Código: #include <stdio.h> Código: leo@lein:~/Escritorio/c_proyect/intgrande$ ./code Aquí otra manera de construirlo. Código
Código: leo@lein:~/Escritorio/c_proyect/intgrande$ cat code.c Título: Re: [C]Calcular pi Publicado por: HRSLASH en 10 Agosto 2010, 23:23 pm Hola leo!! gracias por tu ayuda!! ahora tengo un problema.. cuando copio el codigo q escribiste y lo pego en el dev-c++, al compilarlo me muestra cualquier numero, esta copiado identico pero no funciona :-\ es pq no uso el gcc?
otra preg, pq usas el tipo register? y la ultima.. q significa esta condicion(i & 1), estaba mal la q habia puesto antes?? Bueno espero tu rta :D Saludo!! Título: Re: [C]Calcular pi Publicado por: leogtz en 20 Agosto 2010, 19:58 pm otra preg, pq usas el tipo register? y la ultima.. q significa esta condicion(i & 1), estaba mal la q habia puesto antes?? Bueno espero tu rta :D Saludo!! El código funciona bien con gcc que es el que uso, no sé como funcionará con MingW. El especificador register pone las variables en un registro del CPU en lugar de estar en la memoria, es por esto que las operaciones con las variables register se hacen mucho más rápido. Título: Re: [C]Calcular pi Publicado por: Littlehorse en 20 Agosto 2010, 23:42 pm En realidad el especificador register no es mas que una "sugerencia", en todo caso es el compilador el que decide si hacer caso o no a esa "sugerencia".
En otras épocas se utilizaba, pero en la actualidad la complejidad subyacente es otra por tanto el compilador hace un mejor trabajo optimizando código que nosotros, por lo menos en la gran mayoría de los casos. De hecho, Visual Studio ni siquiera acepta la sugerencia: Citar The compiler does not accept user requests for register variables; instead, it makes its own register choices when global register-allocation optimization (/Oe option) is on. However, all other semantics associated with the register keyword are honored. y GCC lo ignora en caso que la dirección de la variable se solicite en cualquier punto del programa. Saludos Título: Re: [C]Calcular pi Publicado por: leogtz en 21 Agosto 2010, 03:04 am Claro, Littlehorse, pero qué mejor que decidirlo por nosotros mismos y no el compilador, es decir, ser lo más explícito posible.
En el ejemplo que puse solo se usa para control de bucles, así que no creo que haya problemas en eso. Título: Re: [C]Calcular pi Publicado por: Littlehorse en 21 Agosto 2010, 03:32 am Claro pero, repito, no es una decisión, es una sugerencia que el compilador es libre de ignorar por completo, y de hecho lo hacen en mas de una oportunidad.
Lo aclaro para que no quede la falsa idea que utilizar variables locales register si o si mejora el rendimiento de un programa, ya que esto solo ocurriría en ciertas oportunidades y solamente cuando el compilador lo decida. En el peor de los casos, demasiadas variables register podrían empeorar el rendimiento del programa final. Saludos Título: Re: [C]Calcular pi Publicado por: misterharry en 23 Agosto 2010, 03:32 am q significa esta condicion(i & 1), estaba mal la q habia puesto antes?? en realidad no estaba mal... & tambien es un operador binario (operador AND) y en este caso esta comparando el valor binario de "i" con 1 ej: si i=3 en binario seria 00000011, entonces 00000011 & 1 = 1 si i=2 en binario seria 00000010, entonces 00000010 & 1 = 0 esta siendo utilizado para verificar si el numero es impar :) es decir ( i & 1) es equivalente a (i % 2 == 1) |