圆周率其实就是一个圆周长与直径的比值我们通常用希腊字母π表示, 他的计算公式有多种, 其中用莱布尼茨公式是这样
即:
如果你想知道为什么? 既然你诚心诚意的发问了, 我就大发慈悲的告诉你!
首先看一下等比数列求和公式
= ( = 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..<position {
result += pro * (num4 / series);
series += 2;
pro *= -1 ;
}
return result;
}
```
附:
同样执行1,000,000 次打印
swift执行速度为13s左右, 而OC执行为2分15秒左右, 可见swift运行效率非常快, 而且精度swift更高一些
OC, 可见swift运行效率更高一些