Oracle中實現圓周率計算(二)

yangtingkun發表於2008-08-15

今天兩個同事用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為多項式級數,當N10的時候,精確到小數點後面2位,當N100時,已經精確到小數點後面30位。

N的值位126的時候,確保NUMBER精度範圍內的值都是準確的:

SQL> EXEC P_PI(127)
3.1415926535897932384626433832795028842

PL/SQL 過程已成功完成。

由於Oracle的精度只有38位,因此想要確保100位的精度就只能另外想辦法了。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-429478/,如需轉載,請註明出處,否則將追究法律責任。

相關文章