如何使用C#计算PI的值?
我以为它会通过一个递归函数,如果是这样,它会是什么样子,是否有任何数学公式支持它?
我对性能不太挑剔,主要是从学习的角度来看如何进行.
如果你想要递归:
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(你之前可能听说过他;))想出了这个伎俩.请注意,我省略了最终条件,以保持简单.在现实生活中,你需要一个.
如何使用:
double pi = Math.PI;
如果你想要更好的精度,你需要使用算法系统和Decimal类型.
如果你仔细看看这个非常好的指南:
并行编程模式:使用.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; }
有几个非常非常古老的技巧,我很惊讶在这里看不到.
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之前.当我还是一名本科生时,它是由一位物理教授教给我的.