数据的表示和运算3

浮点数的表示与运算

浮点数的表示

1. 浮点数的表示格式

通常浮点数表示为:

S取0或1,代表的是浮点数的符号

M是一个二进制定点小数,叫做尾数,一般用定点原码小数表示

R是二进制定点整数,称作阶码或指数,用移码表述

E是基数

可见:浮点数是由符号,尾数和阶码组成

32位短浮点数的表示格式

阶码的值反应浮点数的小数点的实际位置,尾码的位数反应浮点数的精度

2. 浮点数的表示范围

3. 浮点数的规格化⭐⭐⭐

规格化操作就是通过调整一个非规格化数的尾数和阶码的大小,使得非零浮点数在尾数的最高数位上保证是一个有效值。

左规:当运算结果的尾数的最高位数不是有效位,即出现+-0.0……的形式,需要进行左规,左规一次,阶码减一。

右规:当运算结果的尾数的有效位近到小数点前边时,要进行右规。右规一次,阶码加一。

阶码为2时的原码规格化尾数M应满足的条件:

1.正数为0.1x...x的形式,最大值为0.11...1,最小值为0.100..00

2.负数为1.1x...x的形式,最大值为1.10...0,最小值为1.111..11

阶码为4时为高两位不全为0

补码的规格化要求符号位和次符号位不一致

eg:详情见王道习题

4. IEEE 754标准⭐⭐⭐⭐

IEEE754标准的浮点数格式

64位和32位的区别在于64位浮点数的阶码11位,尾数52位。而32位的阶码8位,尾数23位

注意!!!我们需要知道,IEEE754标准中对于规格化的尾数,他的最高位永远是1,所以为了提供更高的精准度,这个1被隐藏掉,称为隐藏位。

例如:12的二进制数是1100,把它变成浮点数是1.1×2^3次方,其中小数点左边的1不被存储在IEEE754中,因为大家默认这个一是存在的。

注意!!!在IEEE754标准中,移码的偏移值不是2^n-1次方,而是(2^n-1次方)-1

直接给出实例:1.1×2^3次方,在单精度浮点数的表示中,阶码为3+127=130(82H),在双精度的浮点数表示中,阶码为3+1023=1026(402H)

规格化单精度浮点数的真值表示范围:

N=(-1)^S*1.f×7*2^{e-127}

规格化双精度浮点数的真值表示范围:

N=(-1)^S*1.f*2^{e-1023}

我们需要知道的前置知识点是:在IEEE754的格式中,阶码全0或者全1,有着其他的解释,所以在我们最大值和最小值的考虑中,不去考虑全0或者全1的情况。

根据这两个公式理解上述最小值和最大值

在要求阶码不全为0和1的情况下:(只考虑32位,64位类似)

最小值:阶码为1,尾数全为0,加上隐藏位也就是尾数为1.0.那么真值就是

1.0×2^{1-127}=1.0×2^{-126}

最大值:阶码为1111 1110,即254,尾数全为1,加上隐藏位就是1.1111111,那么真值

1.111...111*2^{254-127}=1.111...111*2^{127}

计算二进制数1.111...111:23位小数的和为等比数列求和结果是

2-2^{-32}

,所以结果就是

2^{127}*(2-2^{-32})

那么我们开始解释前边挖的小坑,当阶码全是0或者全是1时代表什么呢?直接copy王道课本的解释。

OK!!!我们进入例题的步骤,转换十进制数为IEEE754以及转换IEEE754为十进制数

首先:将是十进制数-8.25转换成IEEE 754单精度浮点数

  • 首先将十进制数变为二进制数:-1000.01,将其变为规格化数字1.00001×2的3次方
  • 阶码为3+127=130,转换成8位2进制数10000010
  • 符号位为1
  • 尾数为.00001,不够23位,补0
  • 故结果是 1100 0001 0000 0100 0000 0000 0000 0000
  • 即C1040000H

再来:将IEEE754数C640 0000H变为十进制数

  • 首先将IEEE754数变为2进制数: 1100 0110 0100 0000 0000 0000 0000 0000
  • 将其分类 1 1000 1100 1000 0000 0000 0000 0000 000
  • 1说明他是负数
  • 1000 1100的十进制数是140 140-127=13,也就是阶码位13
  • 1.1000 0000 0000 0000 0000 000 的十进制数是1.5
  • 那么结果就是
  • -1.5*2^{13}

浮点数的加减运算

注意!!!浮点数的加减运算是阶码的运算和尾数的运算分开进行,步骤如下

1.对阶

当加减的两个浮点数阶码不相同时,就无法进行运算,所以我们要先将阶码进行对阶。对阶时要遵循小阶码向大阶码看齐。个人理解如下:与其考虑二进制数的对阶,不如将二进制数变成十进制数考虑。计算得出相差的值,当然如果你可以认清二进制数的对阶当我没说。

为什么不可以大阶码向小阶码看?

因为大变小的话,就要左移,那么最高位就会被移出,ERROR

2.尾数加减

将对阶后的尾数按定点原码小数的加减运算。注意要将隐藏位移出。运算结果可能是不规格化的,要通过后续操作将其变为规格化数。

3.尾数规格化
  • 右规

当结果是1x.xxxx时,要进行右规。尾数右移1位,阶码加一

  • 左规

当结果是0.000001x..x时,要进行左规,直到1移到小数点左边。

4.舍入

在对阶和右规时都有可能进行舍入操作!!!并且舍入后还要考虑是否需要继续规格化

四种舍入方式:

  • 就近舍入,即0舍1入
  • 正向舍入,向+无穷的方向舍入
  • 负向舍入,向-无穷的方向舍入
  • 截断,即丢弃后边所有的位数
5.溢出

在IEEE 754 中判断溢出不是观察尾数,而是观察阶码,因为不管尾数如何溢出,我们都可以通过规格化将其变得不溢出,但是只有阶码都溢出之后才是真的溢出。

正指数超过最大值,127或1023就是指数上溢。

负指数超过最小值,-149或-1074就是指数下溢。 0.00..01

C语言中的浮点数类型

char——int——long——double

float——double

int——float时不会发生溢出,但是当int的24-31位不是0时就会被影响精度

int/float——double,不会影响精度

double——float,会影响精度

float/double——int,有可能发生溢出

这方便的知识点我们通过习题来理解

数据的大小端和对齐方式

由于在存储数据时数据可以从左到右也可以从右到左排列,所以我们只能用LSB(最低有效字节)和MSB(最高有效字节)来表示低位和高位。

01 23 45 67H MSB为01H LSB为67H

大端存储

即先存储高位字节,再存储低位字节

01 23 45 67

小端存储

即先存储低位字节,再存储高位字节

67 45 23 01

边界对齐方式

边界对齐方式要求存储地址是自身大小的整数倍

半字是2的整数倍

字是4的整数倍、

注意!!本章节内容十分繁琐,我们需要详细去写课后习题,然后点点理解相关知识点,尽量不要选择死记硬背相关知识内容,理解是最好的。

  • 63
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值