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:

link

È stato utile?

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:

Patterns

per la programmazione parallela : comprensione e l'applicazione Patterns parallelo con il .NET Framework 4

troverai 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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top