考虑下面的转换代码:
int a = 0x7fFFffff;
float fa= (float)a;
int b = static_cast<int>(fa); a是最大的int最大值为 0x7fffffff
第二个语句将int转换为float fa,
第三个语句再将float转换回来为int,
最后b的值确是
-2147483648 .
下面分析过程
查看fa的二进制0x4f000000,将float表示转换为二进制,并按float位划分表示
s 指数位 尾数位
0 1001 1110 00000000000000000000000
指数值为 0x9e,转换实际值 0x9e-127 = 31,这样计算下来fa的值就是2^31。
可最开始a转为fa时候赋值是 0x7fffffff = 2^31-1,恰好是这个多出来1的导致最后转换回b的值变成了负数。
这个1咋多出来的呢?
这要看从a转换到fa过程中发生了什么。
将a 0x7fffffff按照float 规范方式表达为二进制:
30个1
1. 11...111 * 2^30
但因为float的尾数只有23bit位,所以这里a的小数点后的30位只能保留23位了。
按照最接近拾入规则,会在最后一个bit补上了1,
23bit 24bit 30bit
1. 1111....1 1 1.... 1
得到的拾入后的值为
10. 000...00 (23位0)*2^30
也就是2^31了。这个值用int解读也就是变成int最小值了。
结论:
int到float的转换会因为精度的原因产生各种不一致。
posted on 2014-07-12 21:05
pizzx 阅读(526)
评论(0) 编辑 收藏 引用 所属分类:
c++/boost