咬死猪的狗狗
日志 - 日历
2008 11.18 Tue
      1
2345678
9101112131415
16171819202122
23242526272829
30      
«» 2008 - 11 «»
搜索BLOG文章
博客基本信息
用户名: twn
等级: 幼儿园娃娃
在线时间: 5925 分钟
日志总数: 18
评论数量: 16
访问次数: 48066
建立时间: 2006-03-10
最新访问

我的日志
作者: twn 复制  收藏
关于IEEE754 - 32Bit 大数转10进制显示输出效率估计2007-03-29
在IEEE754-32Bit中当阶码大于23时移位操作将会失去小数存储部分, 
这样会失去转换显示的精度确,一般的方法以字符串去模拟数学运算将会 
造成效率的降低,计算也较不便。 
      例如:0x6FE30000 对应10进制数应约为  
140506194458890661201050599424 = 1.40506194458890661201050599424 E 29 . 
 
我将以如下的步骤去计算并显示数据: 
 
求出2进制阶码为96,小数部分为0x11000110000, 
将小数部分独立出为新IEEE754操作数 0x3FE30000, 
 
296   = 1024 * 1024 * 1024 * 1024 * 1024 * 1024 * 1024 *1024 *1024 * 64. 
 
因为我们只是对超过23次上以上128次方以下的数进行特殊的大数处理,所以,为了减少计算的复杂度,我们将近1个数组为存储10个IEEE754数字, 
因为IEEE754-32Bit本身的精确度为7,8位有效位,并且23位小数最多保留 
小数点的个数为23位,所以在计算过程中难免造成精度的丢失。 
 
下面是unsigned int acData[10] =  
{ 0x3F8637BD,0x3F89705F,0x3F8CBCCC,0x3F901D7C,0x3F9392EE,0x3F971DA0,0x3F9ABE14,0x3F9E74D1,0x3FA2425F,0x3FA6274B,0x3FAA2424 } 
 
作为10进制,此时阶码应该为(96 / 10) * 3= 27 ,此时需将小数位0x3FE30000的阶码位0x7F+ 6 = 0x85,然后形成新的小数位0x42E30000,此时只需要将0x3F9E74D1 * 0x42E30000 =   140.506195068359375,此时 结果就为 140.506195068359375 E 27 ,如果140.506195068359375 > 10的话就规格化下此数。1.40506195068359375 E 29. 
 
这个算法将用到固定的一个数组,此数组将耗去40个BYTE,另外将调用一次 
 
乘法运算,我这边的乘法运算是以移进行操作,所以效率也是非常的快,再次 
 
就是最后将乘法结果进行输出并规格化,此时需为字符串malloc一个空间,最长30BYTE,所以将malloc固定32个BYTE.

原创文章如转载,请注明:转载自咬死一头猪 [ http://twn.blog.zj.com/ ]
本文链接地址:http://twn.blog.zj.com/blog/d-113135.html

下一篇:无
TAG: IEEE754
相关文章
文章评论0条回复
给文章评分
评分: -5 -3 -1 - +1 +3 +5
我来说两句
认证码*   看不清,就点我! 输入四位字母或数字
(您还没有登录,登录发表)
粗体 斜体 下划线 插入url链接 飞行字 移动字