解决方案
一个经典算法用于计算pi
的位数是高斯 - 勒让德算法。虽然速度比不上一些更现代的算法,它确实有被理解的优势。
让
a_0 = 1
b_0 = 1/Sqrt(2)
t_0 = 1/4
p_0 = 1
然后
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
然后
pi =. (a_n + b_n)^2 / (4 * t_n)
下面(=.
指“近似等于”)该算法表现出二次收敛(正确小数位的数目随着每次迭代增加一倍)。
我将让你来此转换为C#,包括发现的高精度计算库。
其他提示
如果你仔细看这个确实不错指南:
对于并行编程模式:了解和使用.NET Framework应用并行模式4
您会在第70页这个可爱的实现找到(从我身边微小的变化):
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;
}
不隶属于 StackOverflow