因为浮点表示形式为
1
.f*2n-
127
我们要表示
0.1
,可以知道 n-
127
=-
4
,到 n=
123
符号为正,可知前
9
是
001111011
,暂时不考虑后面的
23
位小数,所以我们先假设
x=
0x3d800000
;
int
i =
1
<<
22
;
i 初始为第右起第
23
位为
1
,就是 x 的第
10
位
int
j =
1
<<
4
;
i 初始为
4
,因为 n-
127
为-
4
,这里是为了求它的倒数.
float
f =
0
.1f;
int
y = Float.floatToIntBits(f);
y 就是它的
32
位表示
float
rest = f - ( (
float
)
1
) / j;
这个 rest 表示除了
1
.f 中的
1
剩下的,也就是
0
.f
while
(i >
0
) {
j <<=
1
;
float
deta = ( (
float
)
1
) / j;
if
(rest >= deta) {
rest -= deta;
x |= i;
}
i >>=
1
;
}
这个循环来计算
23
位小数部分,如果 rest 不小于 deta,表示这个位可以置为
1
.
其他的不多说了,输入结果是一样的,可以说
0.1
这个浮点数肯定是不精确的,但是
0.5
可以精确的表示,想想为什么吧.