计算机基础 - 浮点数

本文介绍了浮点数的概念,对比了定点数的局限性,并详细阐述了IEEE754标准下的浮点数表示方式,包括单精度和双精度。通过科学计数法解析浮点数的构成,如符号位、指数和尾数,并讨论了规格化和非规格化的表示,特别提到了如何表示0和特殊值的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

想要理解浮点数为什么叫浮点数, 浮点是什么意思, 先告诉你它有个兄弟叫定点数

定点数

一个32位计算机想要存储小数, 最简单的方法是什么
把32位分成三部分, 一位表示正负, 8位表示整数部分, 23位表示小数部分
在这里插入图片描述

由于小数点固定在了第23位和第24位之间, 这种方式可以称为“定点数”
但小数点固定在哪个位置呢
整数部分小了, 表示的数据范围就很小
整数部分大了, 小数的精度又会降低
所以用定点数表示法, 范围和精度相互矛盾, 并不是一种完美的解决方案

浮点数

那么怎么弥补定点数的短板, 就可以用到类似科学计数法, 利用指数, 可以达到小数点浮动的效果
IEEE 754标准中, 浮点数有单精度(32位)和双精度(64位), 以单精度为例
在这里插入图片描述

科学计数法表示为
n=(−1)s∗1.(mantissa)∗2exponentn = (-1)^s * 1.(mantissa) * 2 ^{exponent}n=(1)s1.(mantissa)2exponent
那么例如 5.85.85.8 就可以转换为 1.45∗221.45*2^21.4522 (原数一直除2, 直到整数部分为1)

注意: 指数也分正负, 此处有一个偏置值
bias=2k−1−1bias=2^{k-1}-1bias=2k11 , k为exponent的位数
单精度浮点数bias则为127, 从0到127 表示负数, 从128到255表示正数

那么 5.85.85.8exponent=127+2exponent=127+2exponent=127+2
尾数 0.450.450.45 转化为二进制就是不断地乘2, 取结果的整数部分, 无限循环的话取够23位为止, 此处会有忽略, 所以浮点数不是精确的数值类型

通过上面的过程, 基本了解了浮点数如何表示一般的小数, 那么浮点数怎么表示0呢

规格化和非规格化

指数部分有三种取值:

  • 当exponent的二进制位不全为0或1时, 表达的数字是规格化形式, 即一般的小数
  • 当exponent的二进制位都为0时, 此时为非规格化, 用来表示一些非常接近0的小数,包括0
    此时表达式为
    n=(−1)s∗0.(mantissa)∗21−biasn = (-1)^s * 0.(mantissa) * 2^{1-bias}n=(1)s0.(mantissa)21bias
    当所有二进制位都为0, 即可表示0.0
  • 当exponent的二进制位全为1时, 表示特殊值
    当mantissa全为0时, s为0表示正无穷, s为1表示负无穷
    当mantissa不全为0, 则表示NaN(Not a Number),不是一个合法实数或无穷,或者该数未经初始化
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值