浮点数

来源:互联网 发布:juniper network mac 编辑:程序博客网 时间:2024/05/17 22:50

一、浮点数

1.1 单精度浮点数

1.1.1 定义及计算方法

图1

单精度浮点数由32位构成:

  • 符号位,1 bit,表示正负,0代表正,1代表负;
  • 指数位,8 bits,可以是补码;或者0到255,0~126代表负,127代表0,128~255为正(即指数需减去偏置127);
  • 有效数位,23 bits。有效数位是24位,实际储存23位。有效位数左侧的1不会存储,它一定存在(二进制的第一个有效数字必定是1)。

value=(1)sign×2exponent127×(1+fraction)
sign=+1
exponent=(127)+124=3
fraction=1+22=1.25
value=(+1)×1.25×23=+0.15625

1.1.2 单精度浮点数的表示范围:

负数:3.402823×10381.401298×1045
正数:+3.402823×1038+1.401298×1045

1.2 双精度浮点数

1.2.1 定义及计算方法

图2

双精度浮点数由64位构成:

  • 符号位,1 bit,0代表正,1代表负;
  • 指数位,11 bits。
    类比整型使用所有位为0的数字表示数值“0”,双精度浮点数表示0时指数部分也为。若如此,可能会产生冲突,例如全0的数字可以表示“0”,也可能表示1×20=1。因此此处规定:
    0x000:用来表示带符号的0(尾数为0)或者下溢数(尾数不为0);
    0x7FF:用来代表无穷大(尾数为0)或NaN(尾数不为0);
    其他:代表2exponent0x3FF
  • 尾数:52 bits。
    二进制的科学计数法为:Mantissa×2exponent。为了最大限度提高精确度,将尾数规范化,使其处于1到2之间,便可省去最高位的1。例如:
    二进制的 11.101×21001可以规格化为 1.1101×21010,存储时尾数只需要存储1101即可;
    二进制的 0.00110011×21001可以规格化为 1.10011×21100,存储时尾数只需要存储10011即可。
    于是,规范化的表达形式为:(1.mantissa)×2exponent

综上述,一个双精度浮点数所代表的数值为:
1sign×2exponent0x3FF×1.mantissa

1.2.2 表示范围

可以表示十进制的15或16位有效数字,其可以表示的数字的绝对值范围大约是[2.23×10308,1.79×10308].

二、参考

  1. 单精度浮点数,维基百科
    https://zh.wikipedia.org/wiki/%E5%96%AE%E7%B2%BE%E5%BA%A6%E6%B5%AE%E9%BB%9E%E6%95%B8
  2. 双精度浮点数,维基百科
    https://zh.wikipedia.org/wiki/%E9%9B%99%E7%B2%BE%E5%BA%A6%E6%B5%AE%E9%BB%9E%E6%95%B8