RSS订阅
RSS订阅TT数据库

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

2008-8-21  选择字号:  | |
打印本文章

导读:本介绍了PL/SQL的创建过程、利用PL/SQL实现代码。

关键词:Oracle PL/SQL 圆周率计算 Oracle中实现圆周率计算

正在加载数据...

  上一篇之所以给出一个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位的精度就只能另外想办法了。


Oracle中实现圆周率计算
 Oracle中实现圆周率计算(二)
 Oracle中实现圆周率计算(一)
 Oracle中实现圆周率计算(三)

原文出处:http://space.itpub.net/batch.viewlink.php?itemid=369993
来源:BLOG    
相关的新闻
什么时候适当使用ROWNUM?当在没有共同关键字的情况时,你不关心表之间的特殊关联,即使是正好就存在这样的事实。如果你正在处理相关表,他们基于一个共同的属性……
如果你有两个数据来源,如平面文件或表数据,并且要将他们合并在一起,你将怎么做?如果他们有一个共同的属性,如客户ID,那么该解决方案应该是很明显:合并相关的属性……
怎样使用闪回数据归档?如何审计历史事务?本文主要介绍审计和数据修复、审计历史事务、数据粉碎、修复丢失的或错误修改的数据等有关Oracle 11g闪回数据归档新功能问题。
ORACLE用户常用数据字典的查询使用方法有哪些?本文主要介绍了用户、表、索引、序列号、视图、同义词、约束条件、存储函数和过程以及触发器。
以下返回的查询表示字节和扩展块……,我的问题是:整个表的大小是不是等于44,646,400字节还是44,646,400x218?

本专题介绍了SQL Server服务代理相关方面的知识,包括SQL Server服务代理基础知识的概述、消息类型、契约、队列、服务和路由、SEND命令和RECEIVE命令、性能方面的改进以及对运行状况的监控等等。

无论你是否计划将SQL Server数据库转换服务(DTS)包迁移到SQL Server集成服务(SSIS)或在SQL Server 2005里运行DTS包,都需要专家的一些建议。这一指南主要是包括SSIS的相关基础知识、技巧帮助你进行SSIS调整,还介绍了SSIS有经验的一些用户的具体信息等等。

子查询是一个嵌套在SELECT、INSERT、UPDATE 或DELETE语句,或者另一个子查询里的查询。一个子查询可以返回一行或多行结果给父查询。标量子查询是只返回一个值的查询:只有一个字段的一行记录。标量子查询可以在SQL语句的大多数位置,其中你可以使用一个表达式或一个实际值。
最新更新
专家答疑
技巧
Michael Hillenbrand
你能解释一下数据库公程师、数据库架构师以及数据库管理员之间有什么区别吗?数据库管理员:这是目前最普遍使用的对从事数据库相关的工作的人的头衔。数据库管理员是指……
Brian Peasland
对5GB大小的Oracle 7.3存档或删除的最佳办法是什么?为了便于管理机构查询,这些数据至少需要再用20年的时间。我们担心将来我们不能对它重新获取并迁入一个更新的……
Rudy Limeback
如何创建一个约束限制2007年1月1日之前的日期被录入?用CHECK约束就可以。如下面的示例……