浮点数在内存中的存储

2024-01-19 11:50:02 浏览数 (1)

一、用科学计数法存储小数

一个小数,如5.5,它在存储进入计算机之前会先转化成科学计数法的形式,先将5.5转化为二进制形式,即101.1,接着转化成科学计数法的形式便是1.011*2²,再进一步转化为国际标准IEEE(电气和电子工程协会)的形式,那么什么是国际标准IEEE的形式呢?

(1)国际标准IEEE

根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:

V=(-1)^S * M * 2^E ,为什么是2^E呢?举两个例子:

5000在十进制转化为科学计数法是5*10^3,160在八进制转化为科学计数法是1.6*8^2

那么,这个2 ^ E也不难理解了吧。

(-1)^S表示符号位,显而易见, 当S=0,V为正数;当S=1,V为负数

M表示有效数字, M的范围为1<=M<2 ,根据科学计数法和二进制环境(0,1)得出来的结论

2^E表示指数位。

总结: (-1)^S为符号位,M为有效数字,2^E表示指数位

(2)练习:

将以下小数转化为国际标准IEEE的形式

5.5、-9.25、8.75、3.875,-6.125

5.5:第一步,转换为二进制形式:101.1

第二步,科学计数法,1.011*2²

第三步,国际标准IEEE,

不难看出,我们距离国际标准IEEE的 V=(-1)^S * M * 2^E只差符号位的表示,

这个是正数故S=0,接下来套公式,那么M就是1.011,E就是2即(-1)^0 *1.011* 2^3

(之后方法笔者就直接简写了,不再赘述)

-9.25:转二进制:-1001.01

科学计数法:-1.00101*2³

转IEEE,最后放一次公式,记牢它 V=(-1)^S * M * 2^E

-9.25是负数,S=1,套公式,M=1.00101,E=3即(-1) ^1 *1.00101* 2^3

8.75:转二进制:1000.11

科学计数法:1.00011*2³

转IEEE,是正数,S=0,M=1.00011,E=3即(-1) ^0 *1.00011* 2^3

(套公式接下来也不写了,S,M,E才是核心)

3.875:转二进制:11.111(0.5 0.25 0.125=0.875)

科学计数法:1.1111*2^1

转IEEE,S=0,M=1.1111,E=1

-6.125 转二进制:110.001

科学计数法:1.10001*2²

转IEEE,为负数S=1,M=1.10001,E=2

练习部分就结束了,相信大家对于小数转为 国际标准IEEE的形式已经有所了解,接下来进入本文的重点部分,浮点数在内存中的存储

二、浮点数在内存中的存储

浮点数数据在32位的处理器上最高的1位存放符号位(S)

接着的后8位存放指数位(E)

最后的23位存放有效数字(M)

继续拿5.5举例,5.5转IEEE: (-1)^0 *1.011* 2^3不难看出第一个字节将会存放数字0

接着的八个字节会存放3

最后的23个字节存放1.011

浮点数据在64位处理器,最高的1位是符号位S,

接着的 11 位是指数 E ,

剩下的 52 位为有效数字 M 。

(1)关于S的存放

这个没什么好说,直接放进去就是

(2)关于E的存放

因为指数可以是负数,所以在进行存放之前会加一个中间值,这个中间值根据32位处理器和64位处理器分别是 127和1023

在二进制转换后

情况1: E不全为0且不全为1

在取出E的数据后(即转换为十进制后)-127或减1023即可

情况2: E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,

有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于

0的很小的数字。

情况3:E全为1

这个时候就是根据正负号分别是无穷大,无穷小

(3)关于M的存放

IEEE 754 规定,在计算机内部保存 M 时,默认这个数的第一位总是 1

因此可以被舍去,只保存后面的 xxxxxx部分。

比如保存 1.01(5.5十进制) 的时候,只保存01 ,等到读取的时候,再把第一位的 1 加上去。这样做的目的,是节省 1 位有效数字。

那么不难理解,23位可以存放23个数字,也就是小数点后至多可以存放23位数字

那么再加上之前舍弃的1,就可以存放24位的数据

到这里,今天的分享就结束了,祝友友们前程似锦O(∩_∩)O

0 人点赞