Oracle中實現圓周率計算(二)
今天兩個同事用JAVA實現圓周率一百位小數的實現。一個同事問我要不要試試,由於很長時間沒有寫過JAVA程式碼,而且本身JAVA的水平就很差,於是打算用ORACLE實現。
這篇給出一個真正的演算法。
Oracle中實現圓周率計算(一):http://yangtingkun.itpub.net/post/468/468799
上一篇之所以給出一個WRAP之後的PL/SQL程式碼,實際上是和同事開了個小玩笑,這個用時不到5分鐘的PLSQL程式碼如下:
SQL> SET SERVEROUT ON
SQL> CREATE OR REPLACE PROCEDURE P_PI(P_N NUMBER DEFAULT 10) AS
2 V_PI VARCHAR2(102) DEFAULT '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679';
3 BEGIN
4
5 DBMS_OUTPUT.PUT_LINE(SUBSTR(V_PI, 1, P_N + 2));
6 END;
7 /
過程已建立。
SQL> EXEC P_PI
3.1415926535
PL/SQL 過程已成功完成。
SQL> EXEC P_PI(100)
3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706
PL/SQL 過程已成功完成。
小的時候背過圓周率,恰好能背到100位,因此都不用google就可以完成上面的程式碼。記得大學的時候幾個同學去參加一個C語言的程式設計競賽,題目就是實現圓周率的計算,由於競賽不看原始碼,只關注執行時間,於是幾個同學開始分工,一個默寫圓周率,另外幾個寫一個簡單的延遲程式,延遲之後直接輸出結果就可以了。
扯遠了,其實計算圓周率的多項式展開有很多種,隨便GOOGLE一下都可以找到一堆,而且還有各種演算法的詳細說明。
個人認為ORACLE實在不適合來討論演算法,所以只挑了一個比較簡單的演算法進行計算,多項式為:PI=2+1/3*(2+2/5*(2+3/7*(2+…(2+N/(2N+1))…)))
利用PL/SQL實現程式碼如下:
SQL> CREATE OR REPLACE PROCEDURE P_PI(P_N NUMBER DEFAULT 10) AS
2 V_RESULT NUMBER DEFAULT 1;
3 V_COUNT NUMBER DEFAULT P_N;
4 BEGIN
5 LOOP
6 EXIT WHEN V_COUNT = 0;
7 V_RESULT := 2 + V_COUNT / (2 * V_COUNT + 1) * V_RESULT;
8 V_COUNT := V_COUNT - 1;
9 END LOOP;
10 DBMS_OUTPUT.PUT_LINE(TO_CHAR(V_RESULT));
11 END;
12 /
過程已建立。
SQL> EXEC P_PI
3.14084209564085725076437150740556313312
PL/SQL 過程已成功完成。
SQL> EXEC P_PI(100)
3.14159265358979323846264338327929528649
PL/SQL 過程已成功完成。
使用這種方法,N為多項式級數,當N為10的時候,精確到小數點後面2位,當N位100時,已經精確到小數點後面30位。
當N的值位126的時候,確保NUMBER精度範圍內的值都是準確的:
SQL> EXEC P_PI(127)
3.1415926535897932384626433832795028842
PL/SQL 過程已成功完成。
由於Oracle的精度只有38位,因此想要確保100位的精度就只能另外想辦法了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-429478/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle中實現圓周率計算(三)Oracle
- Oracle中實現圓周率計算(一)Oracle
- 圓周率的計算 (轉)
- VB計算圓周率的方法
- 幾種計算圓周率的軟體比較
- 使用Kubernetes裡的job計算圓周率後2000位
- PLSQL實現計算圓的面積SQL
- 圓周率π的計算曆程及各種腦洞大開的估計方法
- Google:Google Cloud再次打破了百萬億位的圓周率計算紀錄GoCloud
- 如何用python求圓周率?Python
- 蒙特卡羅法求圓周率
- Oracle中實現連乘(二)Oracle
- 新紀錄!谷歌 Cloud 計算出圓周率“ π” 第 100 萬億位數谷歌Cloud
- 蒙特卡羅演算法求圓周率Pi的值演算法
- 【倉頡】入門文件程式碼圓周率估算程式碼更正
- ios實現圖片圓角方式小計iOS
- Android 圓角、圓形 ImageView 實現AndroidView
- 第二週 資料計算實現與順序程式設計(一)程式設計
- 橢圓曲線加法原理計算
- 計算圓的面積程式碼
- 計算機網路實驗二計算機網路
- oracle中通過decode實現行變列的二維表統計展示Oracle
- 如何實現邊緣計算中的節點自治
- 機器學習中那些相似度的計算方法及實現機器學習
- ACCESS 在資料表中實現簡單計算
- 計算機中的二進位制計算機
- Oracle實現統計Oracle
- Android Xfermode 實戰 實現圓形、圓角圖片Android
- js實現四則計算(中綴,字尾表示式)JS
- UIImageView 實現圓角效果UIView
- 12條語句學會oracle cbo計算(二)Oracle
- css實現圓形、橢圓和半圓效果程式碼例項CSS
- 三種語言實現計算二進位制中1的個數(C++/Python/Java)C++PythonJava
- 在相親原始碼開發中,如何實現圓角及特殊圓角的使用?原始碼
- Flink使用二次聚合實現TopN計算-亂序資料
- Oracle中實現連乘Oracle
- oracle實驗記錄 (oracle consistent gets 計算)Oracle
- 在Java中實現浮點數的精確計算 (轉)Java