float数据类型
C语言中的float代表单精度的浮点数据类型.按书上讲的float最多可表示7位有效数字,数字可正可负,指数范围为-37~38之间.比如 3.4e2= 3400 就是一个浮点数,前面那个叫做科学计数法. 当然如果在C语言中定义一个float常量的话需要在后面加上f或F,要不然默认是被看成double(双精度浮点数).所以前面的数在C中如果要表示成单精度浮点数的话应该是3.4e2f.
本人比较奇怪的是为什么是7位有效数字而不是8位,9位.于是查阅了相关资料.原来C中的float是按照国际标准的IEEE754标准来表示的.这个标准除了定义了float外还定义了另外几种浮点数的表示法. 可参考这里. 我们最常用的就是float和double,这两个类型还有一个别名分别是binary32和binary64.就是说分别是用32位和64位来表示的.
来看下float, 他有1个符号位,8个指数位及24个有效数位(只保存23位). 当然刚才的binary32中的binary表明他是以二进制形式保存的.下图是一个float在内存中的表示.
第31位是符号(sign)位,23~30是指数(exponent)位,0~22是有效数(fraction小数)位. 其中有效数中还有一个隐藏位,永远是1. 所以有效数位的那部分永远是1.xxxxxxx...(23个x).另外一个要注意的地方是指数的表示,在IEEE754中规定是用偏移指数的方式表示的,意思是指数位中的数减去127后的数来表示最终的指数.比较上面的图中指数部分是01111100,转换成十进制数为124,然后减去127,结果是-3,也就是说指数部分是2-3=1/8=0.125 .那么有效数部分呢? 加上隐藏的位之后表示为 1.01000000000000000000000=1+(1*2-2)=5/4=1.25 ,所以上面表示的数就是 1/8 * 5/4 = 0.15625 .
指数可表示的最大值和最小值分类是127和-126,按理说8位应该可表示-128~127之间,设置成-126的目的是为了防止最小的数(1/2-126)不上溢出(这个有点难理解,文档上是这么说的).这里的127,-126是作为2的指数表示的,那么当表示成10的指数时应该是多少呢? 我们知道函数 y=10x 的反函数为 x = log10y ,当然这里的10可以后任何其它数. 所以2127=10x => x = log2(127) = 38.23 约等于38, log2(-126) = -37.99约等于-37,由是就有了-37~38这样的指数范围. 那么7位有效数字呢? 同样的道理 log2(24) = 7.22 ,也就是说24位二进制有效位相当于107 的数量级,也就是7位有效数字. 那么浮点数最大可以表示的数是多少呢? 我们知道指数最大是127,有效数最大的话是每位全部都是1,所以这个数应该是
1.11111111111111111111111*2127 ≈ 3.4028234 * 1038 .
浮点数其实还包括像四舍五入这样的问题.这里就不说了.(完)
相关链接:
http://en.wikipedia.org/wiki/Binary32