浮点数如何存储

     C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit。单精度类型和双精度类型在计算机存储格式如下所示:
浮点数单精度双精度存储

图1 浮点类型的数据的存储格式

     要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:

      举个例子:78.375,是一个正小数。要在计算中存储这个数,需要把它表示为浮点数的格式,先进行二进制转换(ps:二进制的小数点和十进制的小数点是不同的。二进制小数点后是2的负幂,十进制是10的负幂):

一、小数的二进制转换(浮点数)

     78.375的整数部分:
(78)10=(1001110)2

     78.375的小数部分:
(0.375)10 = 3/8 = 1/4+1/8 = 2-1+2-3 = (0.01)2+(0.001)2 = (0.011)2

所以,78.375的二进制形式就是1001110.011
然后,使用二进制科学计数法,则有
(78.375)10 = (1001110.011)2 = 1.001110011 ×26
注意,转换后用二进制科学计数法表示的这个数,有底数、有指数、有小数,称为浮点数。

二、浮点数在计算机中的存储

     在计算机中,保存这个数使用的是浮点数表示法,分为三大部分,如图2所示:

     第一部分用了存储符号位(sign),用来区分正负数,这里是0,表示正数;

     第二部分用来存储指数(exponent),这里的指数是十进制的6;

     第三部分用来存储小数(fraction),这里的小数部分是001110011;
注意:指数也有正负之分。
浮点数单精度双精度存储

图2 浮点数在计算机中的存储格式

1.单精度表示法

      Float类型的32位单精度表示如下:

     符号位(sign)占用1位,用来表示正负数,

     指数位(exponent)占用8位,用来表示指数,

     小数位(fraction)占用23位,用来表示小数,不足位数补。

浮点数单精度双精度存储

2.双精度表示法

     Float类型的64位单精度表示如下:

     符号位(sign)占用1位,用来表示正负数,

     指数位(exponent)占用11位,用来表示指数,

     小数位(fraction)占用52位,用来表示小数,不足位数补。
浮点数单精度双精度存储

     总结:指数位决定了大小范围,因为指数位数越大,则表示的数越大;而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大。

三、指数位的偏移量与无符号表示

     需要注意的是指数可能是正数如78.375,也可能是负数,如0.0375,即指数是有符号整数,而有符号整数的计算要比无符号整数计算麻烦,所以为了减少不必要的麻烦,在实际存储指数时,需要把指数转为无符号整数。转换过程如下:

     注意到float的指数部分是8位,则指数的取值范围是-126到+127,为了消除负数带来的实际计算上的影响(比如比较大小、加减法等),可以在实际存储时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量位127,这样就不会有负数出现了。

     • 比如指数如果是6,则实际存储的是6+127 = 133,即把133转换为二进制后再存储;

     • 指数如果是-3,则实际存储的是-3+127 = 124,即把124转换为二进制再存储;

     • 当我们需要计算实际代表的十进制数的时候,再把指数减去偏移量即可。

     • 对于double类型,存储的时候指数偏移量是1023。

最后

     所以用float类型来保存十进制小数78.375,需要先得到符号位、指数位和小数部分。这个例子前面已经分析过,所以:

     符号位为0;

     指数位为6+127=133,二进制表示为10 000 101;

     小数部分是001110011,不足部分自动补0;

     连起来用float表示,加粗部分是指数位,最左边是符号位0,代表正数:

0 10000101 001110011 00000 00000 0000

     如果用double来存储,符号位和最后0的个数有变化,需要注意。
浮点数单精度双精度存储

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-08-04
  • 2022-12-23
  • 2021-10-12
  • 2021-10-03
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-11-18
  • 2021-09-14
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2022-01-06
相关资源
相似解决方案