上一篇之所以给出一个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位的精度就只能另外想办法了。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
甲骨文自治数据库亮相 带来云计算新希望
早前甲骨文还不在云计算公司之列,而现在该公司正在迅速弥补其失去的时间。甲骨文的云计算核心是甲骨文自治数据库(O […]
-
2017年12月数据库流行度排行榜 定格岁末排名瞬间
数据库知识网站DB-engines最近更新的2017年12月份数据库流行度排名情况是否能提供更多的看点呢?TechTarget数据库网站将与您分享12月份的榜单排名情况,让我们拭目以待。
-
2017年11月数据库流行度排行榜 半数以上数据库积分减少
数据库知识网站DB-engines更新了2016年11月份的数据库流行度排行榜。TechTarget数据库网站将与您一同关注11月份的榜单排名情况。
-
控制合约 不再畏惧Oracle
许多公司都与Oracle有无限制授权协议,他们害怕离开这个协议,所以就证明他们在使用Oracle的软件,即使因为需求单独购买部分授权许可也可能总体是省钱的。