wvd*_*hel 42
如果你想要递归:
PI = 2 * (1 + 1/3 * (1 + 2/5 * (1 + 3/7 * (...))))
Run Code Online (Sandbox Code Playgroud)
经过一些改写后,这将成为:
PI = 2 * F(1);
Run Code Online (Sandbox Code Playgroud)
与F(i):
double F (int i) {
return 1 + i / (2.0 * i + 1) * F(i + 1);
}
Run Code Online (Sandbox Code Playgroud)
Isaac Newton(你之前可能听说过他;))想出了这个伎俩.请注意,我省略了最终条件,以保持简单.在现实生活中,你需要一个.
Ski*_*izz 23
如何使用:
double pi = Math.PI;
Run Code Online (Sandbox Code Playgroud)
如果你想要更好的精度,你需要使用算法系统和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;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
有几个非常非常古老的技巧,我很惊讶在这里看不到.
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之前.当我还是一名本科生时,它是由一位物理教授教给我的.