Cercando di calcolare pi a un numero N di decimali con C #
Domanda
Nota: ho già letto questo argomento , ma io non lo capisco e non fornisce una soluzione ho potuto usare. Io sono terribile con problemi numerici.
Che cosa è un modo semplice per generare Pi a quale numero di decimali un utente vuole? Questo non è per i compiti, solo cercando di completare alcuni dei progetti elencati qui:
Soluzione
Un algoritmo per il calcolo classico cifre pi
è l'algoritmo di Gauss-Legendre. Anche se non è veloce come alcuni degli algoritmi più moderni si ha il vantaggio di essere comprensibile.
Sia
a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1
Poi
a_(n+1) = (a_n + b_n) / 2
b_(n+1) = Sqrt(a_n * b_n)
t_(n+1) = t_n - p_n * (a_n - a_(n+1))^2
p_(n+1) = 2 * p_n
Poi
pi =. (a_n + b_n)^2 / (4 * t_n)
Qui (=.
significa "approssimativamente uguale a") Questo algoritmo presenta convergenza quadratico (il numero di cifre decimali corrette raddoppia con ogni iterazione).
Lascio a voi per tradurre questo in C # tra cui la scoperta di una libreria precisione arbitraria aritmetica.
Altri suggerimenti
Il tema vostro parlare calcolare il valore di PI utilizzando la serie di Taylor. Utilizzando la funzione "doppia F (int i)" scritto su questo argomento vi darà il valore di PI, dopo i termini "i".
Questo modo di calcolare PI è una specie di lenta, vi consiglio di guardare il PI veloce algoritmo .
È inoltre possibile trovare un'implementazione qui che ottenere il PI calcolare al n ° cifre.
In bocca al lupo!
Se si dà un'occhiata da vicino a questa davvero buona guida:
Patternstroverai a pagina 70 questo simpatico implementazione (con lievi modifiche da parte mia):
static decimal ParallelPartitionerPi(int steps)
{
decimal sum = 0.0;
decimal step = 1.0 / (decimal)steps;
object obj = new object();
Parallel.ForEach(Partitioner.Create(0, steps),
() => 0.0,
(range, state, partial) =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
decimal x = (i + 0.5) * step;
partial += 4.0 / (1.0 + x * x);
}
return partial;
},
partial => { lock (obj) sum += partial; });
return step * sum;
}