浮点数的存储方式

目录

一、浮点数存储方式分类

二、浮点实数存储方式

2.1 如何把浮点数转为二进制数

 2.2 为什么浮点数存在精度问题

三、double类型如何存储


为什么浮点数不适合比较大小和比较相等的操作?原先只听说跟浮点数的精度有关,浮点数为什么会有精度缺失问题?需要看一下浮点数在计算机中如何存储。

一、浮点数存储方式分类

在计算机发展过程中,出现了两类存储方式,分别是定点实数存储和浮点实数存储方式:

1、定点实数存储方式:约定整数位和小数位的存储长度,比如高两位放整数位,低两位存放小数位。

优点是方便计算;缺点是存储的数据范围有限;

2、浮点实数存储方式:用一部分二进制位存放小数点位置,称为“指数域”,其他全部用来存储没有小数点时的数据和符号,称为“数据位”、“符号域”。

优点是存储的数据范围更大;缺点是计算比定点实数存储慢些;

80286出现后,有了浮点协处理器,计算实数的效率提升了,浮点实数存储方式得到普及,成为了主流。

二、浮点实数存储方式

以32位操作系统为例,单精度浮点数类型float占四字节,双精度浮点数类型double类型占八字节。浮点数在转换为二进制存储时,需要使用科学计数法,通过科学计数法把浮点数拆分成三部分:符号位、指数位、尾数位。

由于指数为负,所以规定了指数位的值=科学计数法中的指数+127。

 F:符号位,占1位,1表示负,0表示正

Z:指数位,占8位,不足8位,高位补0

W:尾数位,占23位,不足23位,低位补0

2.1 如何把浮点数转为二进制数

以12.25为例,整数部分我们都知道十进制转为二进制的方法,比如12 = 2^3 +  2^2 =》 1100,从最低开始往左代表,为2^0、2^1、2^2.......所以小数的表示从20往右,分别代表2^-1、2^-2、2^-3、2^-4、......

 0.25 = 2^-2 =》 10,所以12.25转换为二进制即1100.01 用科学计数法表示为1.10001 x 2^3 ,存储时,符号位为0,指数位为3+127 = 130 =》 10000010,尾数为10001所以在小端模式下存储为:

 2.2 为什么浮点数存在精度问题

以1.3这个有穷数为例,0.3 = 2^-2+2^-5+2^-6+2^-9+2^-10+2^-13......

转换为二进制变成了1.0100110011001100110011001......

变成了无穷数,这个时候只能在第23位舍0进1,即1.0100110011001100110010

最终在内存中存储为:

由于在转换的过程中,丢失了位数,所以这只是近似值,如果把这个近似数转为十进制小数,会得到1.2516582,这就是为什么在比较浮点数相等时,一般建议我们使用区间而不是直接等值比较,而由于这种编码方式,可以发现,绝对值越大的数,精度越大,因为绝对值大时,整数部分占太多位置,小数部分舍弃的多。

三、double类型如何存储

double类型是双精度类型,在32位操作系统中占8字节,doube类型的编码方式跟float类型是差不多的,也是分为符号位、指数位、尾数位,只是长度跟float不同。其中符号位占一位,指数位占11位,指数位的值=指数+1023,剩下的位数存尾数。

  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言中的浮点数使用IEEE 754标准来进行存储。IEEE 754标准规定了浮点数的表示方法,包括浮点数的符号位、指数位和尾数位。 在C语言中,浮点数使用float和double两种数据类型进行表示。float类型占用4个字节,double类型占用8个字节。 浮点数存储方式可以分为三个部分: 1. 符号位(Sign):浮点数的符号位用一个bit来表示,0表示正数,1表示负数。 2. 指数位(Exponent):浮点数的指数位用一定的位数来表示。在float类型中,指数位占用8个bits,而在double类型中,指数位占用11个bits。指数位的值通过偏移码来表示,偏移码是指将真实的指数值加上一个偏置值,这个偏置值在float和double类型中分别是127和1023。指数位的值表示了浮点数的数量级。 3. 尾数位(Significand or Mantissa):浮点数的尾数位用一定的位数来表示。在float类型中,尾数位占用23个bits,而在double类型中,尾数位占用52个bits。尾数位的值表示了浮点数的精度和小数部分。 浮点数的实际值可以通过以下公式计算得到:实际值 = (-1)^符号位 × (1 + 尾数位) × 2^(指数位 - 偏置值)。 浮点数存储方式使得它可以表示非常大和非常小的数,并且具有一定的精度。然而,由于浮点数存储方式以及精度问题,对于一些比较精确的计算,可能需要使用其他更为精确的数据类型或者进行一些特殊的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值