网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > PL/SQL > Oracle中实现圆周率计算(二)-PLSQL  

Oracle中实现圆周率计算(二)-PLSQL

2008-08-22  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

    上一篇之所以给出一个WRAP之后的PL/SQL代码,实际上是和同事开了个小玩笑,这个用时不到5分钟的PLSQL代码如下:

网管u家u.bitscn@com

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 /
网管网www_bitscn_com

  过程已创建。

网管有家www.bitscn.net

SQL> EXEC P_PI
  3.1415926535
网管联盟bitsCN@com

  PL/SQL 过程已成功完成。 

网管联盟bitsCN_com

SQL> EXEC P_PI(100)
  3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706
中国网管论坛bbs.bitsCN.com

  PL/SQL 过程已成功完成。 网管网www.bitscn.com

  小的时候背过圆周率,恰好能背到100位,因此都不用google就可以完成上面的代码。记得大学的时候几个同学去参加一个C语言的编程竞赛,题目就是实现圆周率的计算,由于竞赛不看源码,只关注执行时间,于是几个同学开始分工,一个默写圆周率,另外几个写一个简单的延迟程序,延迟之后直接输出结果就可以了。

中国网管联盟bitsCN.com

  扯远了,其实计算圆周率的多项式展开有很多种,随便GOOGLE一下都可以找到一堆,而且还有各种算法的详细说明。 网管u家u.bitscn@com

  个人认为ORACLE实在不适合来讨论算法,所以只挑了一个比较简单的算法进行计算,多项式为:PI=2+1/3*(2+2/5*(2+3/7*(2+…(2+N/(2N+1))…))) 网管联盟bitsCN_com

  利用PL/SQL实现代码如下:

网管bitscn_com

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 /
网管联盟bitsCN_com

  过程已创建。

中国网管论坛bbs.bitsCN.com

SQL> EXEC P_PI
  3.14084209564085725076437150740556313312
网管u家www.bitscn.net

  PL/SQL 过程已成功完成。 

网管下载dl.bitscn.com

SQL> EXEC P_PI(100)
  3.14159265358979323846264338327929528649
网管论坛bbs_bitsCN_com

  PL/SQL 过程已成功完成。

网管网www_bitscn_com

  使用这种方法,N为多项式级数,当N为10的时候,精确到小数点后面2位,当N位100时,已经精确到小数点后面30位。 网管有家www.bitscn.net

  当N的值位126的时候,确保NUMBER精度范围内的值都是准确的: 

网管网www.bitscn.com

SQL> EXEC P_PI(127)
  3.1415926535897932384626433832795028842
网管下载dl.bitscn.com

  PL/SQL 过程已成功完成。

网管u家u.bitscn@com

  由于Oracle的精度只有38位,因此想要确保100位的精度就只能另外想办法了。 网管联盟bitsCN@com

TAGs   计算   实现       SQL>   过程   P_PI   PL/SQL   V_COUNT       
 上一篇:Oracle 11gR1中细粒度访问网络服务-PLSQL   下一篇:Oracle三种集合数据类型的比较-PLSQL
Oracle中实现圆周率计算(二)-PLSQL 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: