技术论坛

 回复:实数转换后不等

返回主题列表
作者 主题
yu418
侠客

经验值:630
发帖数:245
精华帖:0
楼主    2008-10-28 11:59:44
主题:实数转换后不等
为什么大的数比如L#2147483647转换成实数 然后再ROUND后 和L#2147483647相差那么大呢
刚出幼儿园
侠士

经验值:1017
发帖数:342
精华帖:5
    2008-10-29 13:19:35
精华帖  主题:回复:实数转换后不等
quote:以下是引用阿鸣在2008-10-28 15:42:46的发言:
1.要了解32位浮点数的格式:
第31位为符号位,第30位至第23位为指数,第22位至第0位为尾数。
2.浮点数的数值范围远远大于32位整数,有的浮点数不能成功转换为32位整数。如果被转换的浮点数超出了32位整数的表示范围,在累加器1中得不到正确的结果,此时状态字中的OV和OS为被置1.



对于单精度数,由于我们只有 24 位的指数(其中一位隐藏),所以可以表达的最大指数为 224 - 1 = 16,777,215。特别的,16,777,216 是偶数,所以我们可以通过将它除以 2 并相应地调整指数来保存这个数,这样 16,777,216 同样可以被精确的保存。相反,数值 16,777,217 则无法被精确的保存。由此,我们可以看到单精度的浮点数可以表达的十进制数值中,真正有效的数字不高于 8 位。事实上,对相对误差的数值分析结果显示有效的精度大约为 7.22 位。参考下面的示例:

true value stored value
--------------------------------------
16,777,215 1.6777215E7
16,777,216 1.6777216E7
16,777,217 1.6777216E7
16,777,218 1.6777218E7
16,777,219 1.677722E7
16,777,220 1.677722E7
16,777,221 1.677722E7
16,777,222 1.6777222E7
16,777,223 1.6777224E7
16,777,224 1.6777224E7
16,777,225 1.6777224E7
--------------------------------------
根据标准要求,无法精确保存的值必须向最接近的可保存的值进行舍入。这有点像我们熟悉的十进制的四舍五入,即不足一半则舍,一半以上(包括一半)则进。不过对于二进制浮点数而言,还多一条规矩,就是当需要舍入的值刚好是一半时,不是简单地进,而是在前后两个等距接近的可保存的值中,取其中最后一位有效数字为零者。从上面的示例中可以看出,奇数都被舍入为偶数,且有舍有进。我们可以将这种舍入误差理解为"半位"的误差。所以,为了避免 7.22 对很多人造成的困惑,有些文章经常以 7.5 位来说明单精度浮点数的精度问题。

提示: 这里采用的浮点数舍入规则有时被称为舍入到偶数(Round to Even)。相比简单地逢一半则进的舍入规则,舍入到偶数有助于从某些角度减小计算中产生的舍入误差累积问题。因此为 IEEE 标准所采用。

搂主的问题在转换为浮点数以后是&H4F000000,转换为整数后是&H80000000大于有符号整数的最大值&H7FFFFFFF,所以出现错误就理所当然了。
谁出的题这么难,到处都是正确的答案!!!
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。