圆周率其实就是一个圆周长与直径的比值我们通常用希腊字母π表示, 他的计算公式有多种,  其中用莱布尼茨公式是这样

  即:  

如果你想知道为什么?  既然你诚心诚意的发问了,  我就大发慈悲的告诉你!

首先看一下等比数列求和公式

 =

 

 

 (

= 1)

 = 

 

 

 = 

  (

)

那么针对于下面的等比数列, 我们先证明下这个公式

针对于上面公式我们可看到当

趋向于无穷大,

 (-1, 1) 时, 上面可以写成

我们令

 = 

 带入上方公式可得

两边积分可得

 

此时, 我们将

 带入 可得

我们便得到了莱布尼茨公式, 但是有些心细的人可能注意到了  你

 并不在 

 区间啊

接下来我们就证明 当

 时 上面 收敛于

 即可

我们现在已知

  

对于上面等比数列, 我们对 n+1 项求和可得

 即 

我们把减项移到左边可得

  

我们对上面等式做 0到1上积分可得

接下来我们只需证明当

 最后一项为0 即可

所以我们证明出π的莱布尼茨公式成立

接下来我们用OC 和 Swift 写下这个公式, 即计算下π,  两边乘4可得

  我们可以直接对这个无穷序列进行建模,

我们可看到 分子是4, 分母为 首项为1, 公差 为2 的等差数列,  同时还需留意每一项需要乘上

 (这里我默认首项 index为0)

OC写法:

```

- (CGFloat)calculatePi:(NSInteger)position{

NSInteger num4 = 4;

CGFloat series = 1;

NSInteger pro = 1;

CGFloat result = 0;

for(NSInteger i = 0; i < position; i++){

result +=  pro * (num4 / series);

series += 2;

pro *= -1 ;

}

return result;

}

```

调用, 当我们执行50000次时候

CGFloat result = [self calculatePi: 50000];

NSLog(@"返回结果: %f", result);

返回结果: 3.141573

当次数趋近无穷大时候, 结果趋近于π

Swift写法:

```

func calculatePi(position: NSInteger) -> CGFloat {

let num4: CGFloat = 4;

var series: CGFloat = 1;

var pro: CGFloat = 1;

var result: CGFloat = 0;

for _ in 0..

result +=  pro * (num4 / series);

series += 2;

pro *= -1 ;

}

return result;

}

```

附:

同样执行1,000,000 次打印

swift执行速度为13s左右,  而OC执行为2分15秒左右, 可见swift运行效率非常快,  而且精度swift更高一些

OC, 可见swift运行效率更高一些

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐