background image

 
因为浮点表示形式为

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

可以精确的表示,想想为什么吧.