Oracle10g的新数据类型:本地浮点数据类型
来源:互联网 发布:网络测试仪多少钱 编辑:程序博客网 时间:2024/06/06 03:56
<script type="text/javascript"><!--google_ad_client = "pub-7058131363132249";/* 468x15, 创建于 08-6-3 */google_ad_slot = "4187223796";google_ad_width = 468;google_ad_height = 15;//--></script> <script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
据类型都是基于IEEE二进制浮点运算标准,ANSI/IEEE Std 754-1985 [IEEE 754].
使用这些类型时要加上文字f(BINARY_FLOAT)或者d(BINARY_DOUBLE).比如,2.07f
、3.000094d
SQL和PL/SQL都支持这些新的数据类型:
SQL例子:
CREATE TABLE t (f BINARY_FLOAT, d BINARY_DOUBLE);
Table created.
INSERT INTO t VALUES (2.0f, 2.0d);
1 row created.
INSERT INTO t VALUES (1.5f/0.5f, 1.5d/0.5d);
1 row created.
INSERT INTO t VALUES (1.0f/0.0f, 1.0d/0.0d);
1 row created.
PL/SQL例子:
DECLARE
bf_var BINARY_FLOAT := 2.0f;
bd_var BINARY_DOUBLE := 2.0d;
BEGIN
bf_var := 1.5f/0.5f;
bd_var := 1.5d/0.5d;
END;
/
本地浮点数据类型最大的特点就是比NUMBER类型效率更高
- 硬件运算/数学运算快 5– 10 倍
- 占用更少的内存/磁盘空间(5/9 字节与 1 – 22 字节)
- BINARY_DOUBLE 值范围更大(e308 与 e125)
- 无需类型转换(使用与字节顺序无关的存储格式)
下面程序是使用欧拉级数计算圆周率∏:
∏ = sqrt ( 6 * ( 1 + 1/2*2 + 1/3*2 + ... ) )
方法一:使用NUMBER类型
create or replace procedure Euler_Pi_Number is
subtype My_Number is number;
zero constant My_Number := 0.0;
one constant My_Number := 1.0;
two constant My_Number := 2.0;
six constant My_Number := 6.0;
toler constant My_Number := 0.00000000001;
root_toler constant My_Number := toler/1000.0;
root My_Number;
prev_root My_Number;
prod_over_six My_Number;
prod My_Number;
pi My_Number;
prev_pi My_Number;
step My_Number;
begin
pi := one;
prev_pi := zero;
prod_over_six := zero;
step := zero;
while pi - prev_pi > toler
loop
prev_pi := pi;
step := step + one;
prod_over_six := prod_over_six + one/(step*step);
prod := six*prod_over_six;
prev_root := prod;
root := prod/two;
while Abs(root - prev_root) > root_toler
loop
prev_root := root;
root := (root + prod/root)/two;
end loop;
pi := root;
end loop;
end Euler_Pi_Number;
/
方法二:使用BINARY_DOUBLE类型
create or replace procedure Euler_Pi_Binary is
subtype My_Number is binary_double;
zero constant My_Number := 0.0d;
one constant My_Number := 1.0d;
two constant My_Number := 2.0d;
six constant My_Number := 6.0d;
toler constant My_Number := 0.00000000001d;
root_toler constant My_Number := toler/1000.0d;
root My_Number;
prev_root My_Number;
prod_over_six My_Number;
prod My_Number;
pi My_Number;
prev_pi My_Number;
step My_Number;
begin
pi := one;
prev_pi := zero;
prod_over_six := zero;
step := zero;
while pi - prev_pi > toler
loop
prev_pi := pi;
step := step + one;
prod_over_six := prod_over_six + one/(step*step);
prod := six*prod_over_six;
prev_root := prod;
root := prod/two;
while Abs(root - prev_root) > root_toler
loop
prev_root := root;
root := (root + prod/root)/two;
end loop;
pi := root;
end loop;
end Euler_Pi_Binary;
/
SQL> set timing on
SQL> exec Euler_Pi_Number;
PL/SQL 过程已成功完成。
已用时间: 00: 00: 11.59
SQL> exec Euler_Pi_Binary;
PL/SQL 过程已成功完成。
已用时间: 00: 00: 02.09
上面例子中近似300,000次迭代计算,NUMBER类型花费11.59秒,BINARY_DOUBLE类型花费约2.09秒,性能提高大约5.5倍.
结论:在版本10g之后写一些偏数字科学运行量巨大的存储过程、函数时,对于浮点数字类型要优先考虑使用本地浮点数据类型
本文转自
http://yaanzy.itpub.net/post/1263/200971
- Oracle10g的新数据类型:本地浮点数据类型
- oracle10g数据类型
- oracle10g数据类型
- 浮点数据类型
- oracle10g 数据类型 精心整理
- Oracle10g数据类型总结
- Oracle10g数据类型总结
- 基本数据类型的表现形式(浮点数)
- 关于数据类型是浮点数的二分法
- MySQL数据库浮点数据类型的坑
- 基本数据类型--浮点数不精确的原因
- mysql整数浮点数据类型
- 数据类型之浮点型
- 浮点和布尔数据类型
- JAVA 中的浮点数据类型
- flex4的新数据类型ArrayList
- 创建新的数据类型:类
- ECMAScript6的新特性--数据类型
- [收藏]如何用这篇文章解决我们的工程对普通COM组件的引用:《引用ActiveX/COM组件时的Strong Name》
- 写程序时你喜欢听什么音乐?
- C# 判断文件是否正在被使用
- SQL2005体系结构
- [dotNET]用HttpWebRequest加载证书建立SSL通道时发生异常的解决办法
- Oracle10g的新数据类型:本地浮点数据类型
- [dotNET]使用HttpWebRequest请求远端服务器时如何加载SSL证书
- [dotNET]如何利用ConfigurationSettings.AppSettings.GetValues读取配置文件中多个同Key的value
- 斜杠和反斜杠的区别
- [收藏]Matt Powell的《Server-Side 异步Web Methhods》
- 图形图像处理-之-一个复杂度为常数的快速局部自适应算法 下篇
- 关于Hibernate或者java本身文件编码错误的问题?
- [EntLib]在SR.Strings中使用中文字符串资源
- [EntLib]关于SR.Strings的使用办法