domingo, 5 de agosto de 2012

Calculo de PI usando o conxunto de Mandelbrot [C] [Twitcode (I)]

Estreamos sección con este código:
main(){int i=1,p=10000000;complex c=-3./4+I/p,z=c;for(;++i<5*p;)if(pow(creal(z=z*z+c),2)+pow(cimag(z),2)>=4)exit(printf("%i\n",i));}

Require as seguintes cabeceiras:
// Totalmente necesarias
#include <complex.h>

// Estándar, para evitar queixas do compilador
#include <stdio.h>
#include <stdlib.h>
#include <math.h>


Que fai? Calcula os dixitos de PI con un número `p` de dixitos, baseandose no Conxunto de Mandelbrot (un fractal) [ explicación do "algoritmo" por gaussianos ].

Código desenrrolado:
// Números complexos? librería que te criu
#include <complex.h>

int main(){
    int i = 1,        // Inicializamos o contador de iteracións
        p = 10000000; // E especificamo-la precisión

    complex c = -3./4+I/p, // Poñemo-lo C no punto -3/4 (1/p)*I (sendo I a raíz cadrada de -1)
 z = c;             // É inicializamos Z dende C

    for(i++;i < (5 * p);i++){ // Mentres podamos seguir adiante (se nos pasamos de p*5 algo fallou)
        z = z * z + c; // Adiantamos o Z ó seguinte punto
        if(pow(creal(z),2) + pow(cimag(z),2) >= 4){ // Comprobamos se "escapa"
            printf("%i\n", i); // Se escapa, xa temos o número
            exit(0);
        }
    }
}

Saída: 31415928 (o último díxito non é moi preciso ;)

Saúdos

No hay comentarios:

Publicar un comentario