当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中计算PI?

如何解决《如何在C#中计算PI?》经验,为你挑选了4个好方法。

如何使用C#计算PI的值?

我以为它会通过一个递归函数,如果是这样,它会是什么样子,是否有任何数学公式支持它?

我对性能不太挑剔,主要是从学习的角度来看如何进行.



1> wvdschel..:

如果你想要递归:

PI = 2 * (1 + 1/3 * (1 + 2/5 * (1 + 3/7 * (...))))

经过一些改写后,这将成为:

PI = 2 * F(1);

与F(i):

double F (int i) {
    return 1 + i / (2.0 * i + 1) * F(i + 1);
}

Isaac Newton(你之前可能听说过他;))想出了这个伎俩.请注意,我省略了最终条件,以保持简单.在现实生活中,你需要一个.


怎么会有这么多的赞成?这不会返回**任何**
@jack它没有终止条件或返回值.如果您想创建一个完整的工作示例,我建议您发布一个新的答案.请参阅答案中的注释`注意我省略了最终条件,以保持简单.在现实生活中,你需要一个

2> Skizz..:

如何使用:

double pi = Math.PI;

如果你想要更好的精度,你需要使用算法系统和Decimal类型.


我认为这是一个罕见的情况,你需要比Math.PI更精确;

3> Oliver..:

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

并行编程模式:使用.NET Framework理解和应用并行模式4

你可以在这个可爱的实现中找到(我身边的一些细微变化):

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;
}


+1有趣的方法非常快.但是除了事实上这不能编译(我可以编辑它,如果你想),它也不起作用.无论如何,我的观点是,一旦你做对了,价值似乎'看起来像'PI,深入一下,你会看到它给出的最后一个小数是非常不准确的......每次运行都会改变.来自doc的*double*版本具有相同的问题,但*decimal*one不是更准确.

4> 小智..:

有几个非常非常古老的技巧,我很惊讶在这里看不到.

atan(1)== PI/4,所以当存在值得信赖的反正切函数时,旧栗子是4*atan(1).

一个非常可爱,固定比率的估计,使旧西方22/7看起来像泥土是355/113,这是好几个小数位(我认为至少三或四).在某些情况下,这甚至足以用于整数运算:乘以355然后除以113.

355/113也容易记忆(对于某些人来说):计算一,三,三,五,五,并记住你在命名分子和分子中的数字(如果你忘了哪个三元组去最重要的是,微秒的想法通常会使它理顺.)

请注意,22/7为您提供:3.14285714,这在千分之一是错误的.

355/113给你3.14159292,直到百万分之一没有错.

加.在我的盒子上的/usr/include/math.h中,M_PI是#define'd:3.14159265358979323846,这可能是好的.

从评估PI中得到的教训是,有很多方法可以做到这一点,没有一个是完美的,你必须按照预期用途对它们进行排序.

355/113是一个古老的中国估计,我相信它在多年前的22/7之前.当我还是一名本科生时,它是由一位物理教授教给我的.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有