1

注意:我已经阅读了这个主题,但我不理解它并且它没有提供我可以使用的解决方案。我对数字问题感到很害怕。

将 Pi 生成到用户想要的小数位数的简单方法是什么?这不是家庭作业,只是尝试完成这里列出的一些项目:

关联

4

3 回答 3

6

piGauss-Legendre 算法是计算位数的经典算法。虽然它不如一些更现代的算法快,但它确实具有易于理解的优势。

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#,包括发现一个任意精度的算术库。

于 2010-02-09T04:08:05.250 回答
2

您谈论的主题使用泰勒级数计算 PI 的值。使用在该主题上编写的函数“double F (int i)”将为您提供“i”项后的 PI 值。

这种计算 PI 的方式有点慢,我建议你看一下PI 快速算法

您还可以在此处找到一种将计算 PI 计算到第 n 位的实现。

祝你好运!

于 2010-02-09T02:01:55.387 回答
1

如果你仔细看看这个非常好的指南:

并行编程模式:使用 .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;
}
于 2010-11-26T09:02:27.533 回答