在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/blog/d-113135.html
上一篇:我那枚永远丢失的银戒指
下一篇:无
文章评论 共0条回复









TAG:
评分(