PDA

Visualizza la versione completa : [C] - calcolo di PI-GRECO


matteolandi
30-06-2004, 17:31
ciao,

la funzione che segue calcola pi-greco. In essa sqr() restituisce la radice quadrata e pow() calcola la potenza m-esima di 2. Nella dichiarazione delle var metto m=7 ed uso il metodo con m-1 radici quadrate.



long double pi(void){
/* Calcola pi-greco */
int m = 7, n, i;
long double p, g;
for(n = m - 2, i = 0, g = sqr(2); i < n; ++i, g = sqr(2 + g))
continue;
return(pow(2, m) * sqr(2 - g));
}


Ho 2 domande:

1) esiste un modo + elegante di m=7

2) perch se aumento il valore di m non ottengo + il classico valore 3.1415 magari con una precisiaone maggiore?
cosa non ho capito di questo algoritmo? ad esempio per m=10
ottengo 2.8813


ciao
grazie

Corwin
30-06-2004, 18:11
Ma pi greco non il rapporto tra circonferenza e diametro di un cerchio ? :fagiano:

Corwin
30-06-2004, 23:23
Vabb, mi sono documentato un po', esistono formule per calcolarlo... ;)

1) Il numero 7 arbitrario: puoi mettere il numero di iterazioni che vuoi. Ma aumentare m non rende la funzione pi precisa perch gi un partenza i numeri a virgola mobile sono un approssimazione del numero che dovresti esprimere, e iterare pi volte g = sqr(2+g) oltre un certo punto comincia ad "allontanarti" dal risultato voluto (non ho un compilatore c sottomano, ho copiato la routine in java e se metto m = 25 mi ritrovo alla fine con pi greco che vale 3.16!) :fagiano:
Credo che venga messo 7 perch con la precisione dei double e le operazioni coinvolte nel calcolo il valore che ti permette di avvicinarti di pi al pi greco "reale".
Quello che non riesco a capire come possa darti 2.8813 se metti m=10... :master:

matteolandi
30-06-2004, 23:32
ti ringrazio... mi hai chiarito parecchie cose

non so il perch di 2.8813 forse dipende dai tipi che ho usato

appena ho una risposta la posto

ciao e grazie ancora

/dev/null
30-06-2004, 23:55
Dato che si parla di PI greco...
Tempo fa volevo fare un programma che tira fuori X valori decimali a scelta del PI (so che possibile farlo)...
Avevo cercato qualche formula, ma senza successo...

Voi sapete darmi qualche dritta?
Voglio calcolare il PI arrotondato a un biliardesimo! :D

KaZaA
03-07-2004, 16:57
uppe

sono interessato anch'io...

AleX ZeTa
03-07-2004, 19:12
un po' di basi matematiche... per ottenere PiGreco senza ricorrere a funzioni note gi disponibili nelle librerie math.h (arctan prima di tutto) consigliabile utilizzare qualche metodo di approssimazione serio. Cito i moti pi semplici per ottenere un'approssimazione:

1) dato che 'arctan 1 = pi/4' possiamo scrivere 'pi = 4 * L(arctan x, 1)' dove con L(f(x), c) intendiamo lo sviluppo in serie di MacLaurin della funzione f(x) calcolata in x = c. L(arctan x, 1) = sum[j = 0..n]{(d^j/dx^j(arctan x)|x=0)/ j! * x^j}.
L'errore, approssimato per eccesso, che si commette (dato un numero 'n' di iterazioni) si ottiene come resto di Lagrange:
E = (d^(j+1)/dx^(j+1)(arctan x)|x=0)/ (j+1)! * x^(j+1).

2) dato che 'arctan 1 = pi/4', e dato che 'int[0,1](1/(1+x^2) dx) = arctan 1' allora 'pi = 4*S(1/(1+x^2), 0, 1, n)'. Con S(f(x), a, b) si intende l'approssimazione dell'Integrale da 'a' a 'b' di f(x)dx calcolata col metodo di Simpson dopo 'n' iterazioni. L'errore, approssimato per eccesso, lo si ottiene come:
E = |S(f(x), a, b, n) - S(f(x), a, b, 2n)|

/dev/null
03-07-2004, 20:12
Originariamente inviato da AleX ZeTa
un po' di basi matematiche... per ottenere PiGreco senza ricorrere a funzioni note gi disponibili nelle librerie math.h (arctan prima di tutto) consigliabile utilizzare qualche metodo di approssimazione serio. Cito i moti pi semplici per ottenere un'approssimazione:

1) dato che 'arctan 1 = pi/4' possiamo scrivere 'pi = 4 * L(arctan x, 1)' dove con L(f(x), c) intendiamo lo sviluppo in serie di MacLaurin della funzione f(x) calcolata in x = c. L(arctan x, 1) = sum[j = 0..n]{(d^j/dx^j(arctan x)|x=0)/ j! * x^j}.
L'errore, approssimato per eccesso, che si commette (dato un numero 'n' di iterazioni) si ottiene come resto di Lagrange:
E = (d^(j+1)/dx^(j+1)(arctan x)|x=0)/ (j+1)! * x^(j+1).

2) dato che 'arctan 1 = pi/4', e dato che 'int[0,1](1/(1+x^2) dx) = arctan 1' allora 'pi = 4*S(1/(1+x^2), 0, 1, n)'. Con S(f(x), a, b) si intende l'approssimazione dell'Integrale da 'a' a 'b' di f(x)dx calcolata col metodo di Simpson dopo 'n' iterazioni. L'errore, approssimato per eccesso, lo si ottiene come:
E = |S(f(x), a, b, n) - S(f(x), a, b, 2n)| :master:
Do you speak italian? :stordita: ;)

Apparte gli scherzi... Se devo essere sincero non ho capito molto :(
Io e la matematica non ci vogliamo molto bene :stordita: mi sa che meglio se rinuncio...

iguana13
03-07-2004, 20:33
Se non sai a matematica meglio di s...
Io so che con il software "Mathematica 4" di Wolfang research lo possiede un algoritmo che ti calcola il Pi con n cifre. :ciauz:

/dev/null
03-07-2004, 20:45
Originariamente inviato da iguana13
Se non sai a matematica meglio di s...
Io so che con il software "Mathematica 4" di Wolfang research lo possiede un algoritmo che ti calcola il Pi con n cifre. :ciauz: Anch'io ne conoscevo un paio... Uno si chiama Super PI... Gli altri non mi ricordo :stordita:
Speravo comunque che fosse un p pi facile... Vabb, comunque era solo per provare: calcolare un pi greco con tanissime cifre decimali non mi serve a niente...
:ciauz:

Loading