浮点数构成

浮点数构成

嗯,讨论的主题就是计算机中的浮点数。

一般在写一些静态类型的语言的时候(c , golang等等),通常会提供一种单精度浮点数的数据类型,float(float32),这篇博文主要讲解单精度浮点数,对于双精度浮点数在构造上实际上与单精度浮点数差不了多少,懂了单精度浮点数,对于double也就触类旁通了

关于单精度浮点型的构造:

一般6-8位有效数字(假设float占4个字节,一个符号位,8个指数位,23个尾数。

符号位 _ +(只存放指数)指数位_ _ _ _ _ _尾数_*23

上面给出了浮点数的表示方法,6-8位有效数字大概就是10^6到10^8个数(一般超过7位就四舍五入了),这个与编译器有关。其实,也就是说float里面有2^23=83886087个数,对应大概能表示10^6—10^8个数。一个符号位就是正负的符号0或1,还有8个指数位由于有正负也就是-127~128。

下面来看个例子,比如9.6 在计算机中是如何储存的的呢?
首先将9.6化为二进制为1001.110
而对于IEEE标准要求浮点数必须是规范的,也就是小数点左侧必须为一个有效数字,那么这样可以写成 1.001110 * 2 ^ 3,在二进制中的科学计数法就是2的n次幂
对应的32位表示为:
符号位 0 指数位 1000 0010 尾数 0011 1000 0000 0000 0000 000

(因为IEEE规定了小数点的第一位必须为1,因此,可以将尾数的开头的1去掉,以保存更多的数据)

这里为什么指数是1000 0010呢?
指数是一个无符号的二进制数,原先有符号的8位二进制能够表示-128 ~127,而无符号的8位二进制能够表示0 ~ 255,这里的指数实际上是移码表示的,因此指数3应该表示为127 + 3 = 130,二进制表示就是1000 0010。那为什么要用移码表示呢?因为不同符号的数比较比较困难,而我们又不太可能重新设计一个电路来专门服务这个比较,那要不然全部变成正的好了,这样以来就容易多了。用移码表示能够方便浮点数的大小比较。

猜你喜欢

转载自blog.csdn.net/haodawang/article/details/80328464