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为多项式级数,当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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-429478/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值