如何使用BBP公式直接计算π的第n位
使用BBP公式可以直接求得十六進制π的第n位而不需要計算前n位的數(講道理,我認為是可以計算十進制的第n位的,畢竟其本身就能直接計算出十進制的π,但我沒試),其優點在于可以進行分布式計算,即將一個耗時的運算拆分成若干個運算單元在不同的機器上進行并行運算,提高運算效率。同時也可以用來測試計算機的性能。以下公式將直接求出十進制的π:
其中參數k代表的是所求π的精度,例如:當您希望求出π的前13位的話您只需要將k替換成13即可。其計算出來的結果為3.141592653589793238154767...,得出來也是一個無理數,但只有前13位代表Π。
接下來是如何求得十六進制π的第n位。
首先,您需要知道一個知識點:十進制的小數如何轉換為十六進制?
例如,小數3.1415926轉換為16進制為3.243f69a25b094,為了獲取第一個16進制的小數,我們只需要取3.1415926的小數部分0.1415925乘以16即可得到2.2654816,結果的整數位數即為16十六進制小數轉換后端結果,再取2.2654816的小數部分0.2654816乘以16即可得到第二個16進制小數位,依次類推,當整數部分位10、11、12等大于9的數時,使用a、b、c等代替即可。
所以,如果需要得到16進制π的第n個數,只需要求得16^n*π即可:
其中
計算時,將式子中的j替換為1、4、5、6然后分別代入上式即可。
式子中的k表示精度,d表示需要計算π的哪一位置
繼續得到
這里有兩點值得注意:
然后將計算結果代入第一個式子中即可
最后,還需要注意的點是:代入之后求得的結果需要先去除整數部分然后再乘以16即可得到16進制π的第n位。并且,為了保證第一個式子中求出來的值不為負值,您可能需要在做第一個減法之前加上一個大于4的整數。
下面貼出java代碼:
您需要首先在類中添加常量
以下為方法實現代碼,其中calc16dPI即表示計算(16^d)*π,calc16dSj即表示計算(16^d)*Sj,可以看到,我將k(即代碼中的ACCURACY)設置為了d+10,這個數是我隨便設置的,你也可以將其設置成其他的,具體影響大不大我還沒研究。
BigDecimal calc16dPI(int d) {return FOUR.multiply(calc16dSj(d, 1)).add(BigDecimal.valueOf(3)).subtract(TWO.multiply(calc16dSj(d, 4)).divideAndRemainder(ONE)[1]).subtract(calc16dSj(d, 5).divideAndRemainder(ONE)[1]).subtract(calc16dSj(d, 6).divideAndRemainder(ONE)[1]).divideAndRemainder(ONE)[1];}BigDecimal calc16dSj(int d, int j) {int ACCURACY = d + 10;BigDecimal part1 = BigDecimal.ZERO;BigDecimal part2 = BigDecimal.ZERO;for (int k = 0; k <= d; k++) {part1 = part1.add(SIXTEEN.pow(d - k).divideAndRemainder(EIGHT.multiply(BigDecimal.valueOf(k)).add(BigDecimal.valueOf(j)))[1].divide(EIGHT.multiply(BigDecimal.valueOf(k)).add(BigDecimal.valueOf(j)), ACCURACY, BigDecimal.ROUND_HALF_UP));}for (int k = d + 1; k < ACCURACY; k++) {part2 = part2.add(ONE.divide(SIXTEEN.pow(k - d).multiply(EIGHT.multiply(BigDecimal.valueOf(k)).add(BigDecimal.valueOf(j))), ACCURACY, BigDecimal.ROUND_HALF_UP));}return part1.add(part2);}以下為測試方法,計算十六進制π的前100位,注意在結果上乘以一個16:
@Testpublic void mainCalc() {for (int d = 0; d < 100; d++) {System.out.println("index of " + (d + 1) + ": " + calc16dPI(d).multiply(SIXTEEN));}}運行結果截圖:
分別得到2、4、3、15、6、10、8、8、8、5...則π的十六進制數應該為3.243f6a8885...(整數位3是我手動加上去的)
參考 我有點酷
參考 維基百科 和 The BBP Algorithm for Pi
如果您有什么需要補充或者我說錯的地方歡迎發郵件給我 zouheng613@163.com
bingo
總結
以上是生活随笔為你收集整理的如何使用BBP公式直接计算π的第n位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平衡二叉查找树的构建
- 下一篇: 一英寸芯片大小_芯片生产线的6英寸,8英