一、用科学计数法存储小数
一个小数,如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