圓周率其實就是一個圓周長與直徑的比值我們通常用希臘字母π表示, 他的計算公式有多種, ?其中用萊布尼茨公式是這樣
??即: ?
? ?
如果你想知道為什么? ?既然你誠心誠意的發(fā)問了, ?我就大發(fā)慈悲的告訴你!?
首先看一下等比數(shù)列求和公式
?=
?
?
?(
= 1)
?=?
?
?
?=?
? (
)
那么針對于下面的等比數(shù)列, 我們先證明下這個公式
針對于上面公式我們可看到當趨向于無窮大,
?(-1, 1) 時, 上面可以寫成
我們令??=?
?帶入上方公式可得
兩邊積分可得
?
?
此時, 我們將 ?帶入 可得
我們便得到了萊布尼茨公式, 但是有些心細的人可能注意到了 ?你 ?并不在?
?區(qū)間啊
接下來我們就證明 當??時 上面 收斂于
?即可
我們現(xiàn)在已知???
對于上面等比數(shù)列, 我們對 n+1 項求和可得
?即?
我們把減項移到左邊可得
??
我們對上面等式做 0到1上積分可得
接下來我們只需證明當??最后一項為0 即可
所以我們證明出π的萊布尼茨公式成立
接下來我們用OC 和 Swift 寫下這個公式, 即計算下π, ?兩邊乘4可得
? 我們可以直接對這個無窮序列進行建模,?
我們可看到 分子是4, 分母為 首項為1, 公差 為2 的等差數(shù)列, ?同時還需留意每一項需要乘上??(這里我默認首項 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;
}
```
調用, 當我們執(zhí)行50000次時候
CGFloat result = [self calculatePi: 50000];
NSLog(@"返回結果: %f", result);
返回結果: 3.141573
當次數(shù)趨近無窮大時候, 結果趨近于π
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;
? ? }
```
附:?
同樣執(zhí)行1,000,000 次打印
swift執(zhí)行速度為13s左右, ?而OC執(zhí)行為2分15秒左右, 可見swift運行效率非??? ?而且精度swift更高一些
OC, 可見swift運行效率更高一些