Ahora les traigo dos algoritmos que permiten calcular cifras del PI, totalmente hecho en C#. Utilizo las clases para calcular muchísimas cifras, que publiqué en un post anterior, y a pesar de no ser óptima va a permitir calcular unas cuantas cifras decimales. Para calcular el PI voy a utilizar dos algoritmos distintos. Primer algoritmo: (Gauss-Legendre) private static string CalculoPI1(int desp) { int cifras = 1 << desp; int coma = cifras - (8 * 2); NumeroG a = new NumeroG(cifras, coma); NumeroG b = new NumeroG(cifras, coma); NumeroG t = new NumeroG(cifras, coma); NumeroG p = new NumeroG(cifras, coma); NumeroG a1 = new NumeroG(cifras, coma); NumeroG b1 = new NumeroG(cifras, coma); NumeroG t1 = new NumeroG(cifras, coma); NumeroG p1 = new NumeroG(cifras, coma); NumeroG aux1 = new NumeroG(cifras, coma); NumeroG aux2 = new NumeroG(cifras, coma); NumeroG dos = new NumeroG(cifras, coma); //Estado inicial dos.Asigna(2);//constante a.Asigna(1); aux1.Asigna(2); aux2.RaizCuadrada(aux1); b.Divide(a, aux2); aux1.Asigna(4); t.Divide(a, aux1); p.Asigna(1); //Cálculo de la serie int repeticion = desp;//número de repeticiones for (int i = 0; i < repeticion; i++) { aux1.Suma(a, b); a1.Divide(aux1, dos); aux1.Multiplica(a, b); b1.RaizCuadrada(aux1); aux1.Resta(a, a1); aux2.Multiplica(aux1, aux1); aux1.Multiplica(p, aux2); t1.Resta(t, aux1); p.DesplazamientoAlaIzquierda(1);//multiplica por 2 p1.Copia(p); a.Copia(a1); b.Copia(b1); t.Copia(t1); p.Copia(p1); } //Termina el cálculo aux1.Suma(a, b); aux2.Multiplica(aux1, aux1); t.DesplazamientoAlaIzquierda(2);//multiplica por 4 p.Divide(aux2, t); string PI = (new CodigoDCB(p)).ToString(); return PI; } Segundo algoritmo: (Borwein) private static string CalculoPI2(int desp) { int cifras = 1 << desp; int coma = cifras - (8 * 2); NumeroG a = new NumeroG(cifras, coma); NumeroG y = new NumeroG(cifras, coma); NumeroG a1 = new NumeroG(cifras, coma); NumeroG y1 = new NumeroG(cifras, coma); NumeroG aux1 = new NumeroG(cifras, coma); NumeroG aux2 = new NumeroG(cifras, coma); NumeroG aux3 = new NumeroG(cifras, coma); NumeroG dos = new NumeroG(cifras, coma); NumeroG uno = new NumeroG(cifras, coma); //Estado inicial dos.Asigna(2);//constante uno.Asigna(1);//constante aux1.RaizCuadrada(dos); y.Resta(aux1, uno); aux1.DesplazamientoAlaIzquierda(2); aux2.Asigna(6); a.Resta(aux2, aux1); //Cálculo de la serie int repeticion = desp >> 1;//número de repeticiones for (int i = 0; i < repeticion; i++) { aux1.Multiplica(y, y); aux2.Multiplica(aux1, aux1); aux1.Resta(uno, aux2); aux2.RaizCuadrada(aux1); aux1.RaizCuadrada(aux2); aux2.Resta(uno, aux1); aux3.Suma(uno, aux1); y1.Divide(aux2, aux3); aux1.Suma(uno, y1); aux2.Multiplica(y1, y1); aux3.Suma(aux1, aux2); aux2.Multiplica(y1, aux3); aux3.Multiplica(aux1, aux1); aux1.Multiplica(aux3, aux3); aux3.Multiplica(a, aux1); aux2.DesplazamientoAlaIzquierda((i << 1) + 3); a1.Resta(aux3, aux2); a.Copia(a1); y.Copia(y1); } //Termina el cálculo y.Divide(uno, a); string PI = (new CodigoDCB(y)).ToString(); return PI; } En el main va lo siguiente static void Main(string[] args) { Console.WriteLine("Calculando cifras del PI ..."); int desplazamiento = 13;//Carga la cantidad de cifras, //13 indica 2 a la 13 = 8000 cifras binarias string pi1 = CalculoPI1(desplazamiento); string pi2 = CalculoPI2(desplazamiento); //Muestras las cifras Console.WriteLine(pi1); Console.WriteLine(pi2); //Calculas las cifras iguales de los dos cálculos. int i = 0; for (; (i < pi1.Length) && (i < pi2.Length); i++) { if (pi1 != pi2) break; } Console.WriteLine(); Console.WriteLine("Cifras del PI: {0}", i - 5); //Detiene el programa Console.ReadLine(); } Una captura del cálculo: Nota: es necesario contar con las clases para calcular muchísimas cifras. ENLACES Clases para calcular muchas cifras en C#, necesario para éste post. Algoritmos para el cálculo del PI Algoritmos Más algoritmos Programa para calcular millones de cifras Descarga
Datos archivados del Taringa! original
0puntos
790visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
5visitas
0comentarios
Dar puntos: