本文分类:
Java

Java中的浮点数使用IEEE754标准,内存中由符号(sign)、指数(exponent)和尾数(fraction)三部分组成,指数是一个整数,计算机中整数会采用补码存储,由于补码不能方便地进行浮点数的比较,于是在指数上加一个偏移量,使其成为非负数。对于32位和64位浮点数,这三个的位数为:

符号 指数 尾数 指数偏移量  
32位 1 8 23 127
64位 1 11 52 1023

下面将浮点数32.125转换为64位浮点数:

  1. 整数部分用除2取余法,结果为 100000
  2. 小数部分用乘2取整法,结果为 001
  3. 合起来为 100000.001
  4. 把小数点移动到整数位只有1,结果为 1.00000001 * 2 ^ 101,101是二进制,由于左移了5位,所以是101

下面转换为IEEE浮点数表示:

  1. 符号:正数取0,负数取1,这里是正数,所以为0
  2. 指数:这里要转换为64位浮点数,所以先加上1023,结果为1028,转换为二进制,取11位数 100 0000 0100
  3. 尾数:由于尾数的最高位总是1,所以IEEE754将这一位直接隐藏,于是能多出1个位出来存储小数,提高精度,补齐52位,结果为 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  4. 连起来,结果为 0100 0000 0100 0000 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Java中,浮点数使用p来表示以2为底的指数,如上面的 1.00000001 * 2 ^ 101,使用十六进制表示为 0x1.01p5。下面写一个程序验证一下,依次输出十进制、十六进制和二进制:

double obj = 32.125;
System.out.println(obj);
System.out.println(Double.toHexString(obj));
System.out.println(Long.toBinaryString(Double.doubleToLongBits(obj)));

运行结果为:

32.125
0x1.01p5
100000001000000000100000000000000000000000000000000000000000000
本文来自 [时光记 - 王智超的个人空间](www.hiwzc.com),转载请注明出处。