当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 >
嵌入式学科:float
时间:2018-12-24作者:华清远见

linux C 中用float和double 表示浮点数,在32位电脑中 float 占4字节,double占8字节(可以使用printf(“%u  %u \n”, (unsined int)sizeof(float), (unsined int)sizeof(double)); 语句来测试两个数据类型占的内存空间大小)。那么具体float他能表示的数值取值范围是多少呢?大家知道 int 整型在计算机中是以补码的形式存储,取值范围是(-2147483648 ~ 2147483647),取值范围和他在内存中的表示方式有直接的关系。

C语言中的浮点数遵循IEEE(美国电气和电子工程师学会)二进制浮点数算术标准(IEEE754)是20世纪80年代以来最广泛使用的浮点数运算标准。如果知道float 在内存是如何利用4个字节的内存空间的,那么就知道float他的取值范围了。Float是有符号数,它在内存中是以符号位、指数位和尾数位三个部分的形式进行存储的。其中最高位表示符号位占1bit表示正负,紧跟其后的8位表示指数部分以无符号形式存储所以取值范围是0-255,,剩余的23位表示尾数位 :

第31比特位:1bit(符号位S) 

第30到23比特位 8bits(指数位P) 

第22到0 比特位  23bits(尾数位M)

嵌入式学科,float

表示公式: v = ((-1)^S)*(2(P-126))*(0.M)

S是符号位,只有0和1,分别表示正负。

P是阶码,通常使用移码表示(移码和补码只有符号位相反,其余都一样。对于正数而言,原码、反码和补码都一样;对于负数而言,补码就是其绝对值的原码全部取反,然后加1)。阶码可以为正数,也可以为负数,为了处理负指数的情况,实际的指数值按要求需要加上一个偏差(Bias)值作为保存在指数域中的值,单精度数的偏差值为127,双精度数的偏差值为1023。例如,单精度的实际指数值0在指数域中将保存为127,而保存在指数域中的64则表示实际的指数值-63,偏差的引入使得对于单精度数,实际可以表达的指数值的范围就变成-127到128之间(包含两端)。

M为尾数,其中单精度数为23位长,双精度数为52位长。IEEE标准要求浮 点数必须是规范的。这意味着尾数的小数点左侧必须为1,因此在保存尾数的时候,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。这样实 际上用23位长的尾数域表达了24位的尾数。例如对于单精度数而言,二进制的1001.101(对应于十进制的9.625)可以表达为1.001101 × 23,所以实际保存在尾数域中的值为00110100000000000000000,即去掉小数点左侧的1,并用0在右侧补齐。

嵌入式学科,float

浮点数的表示约定

单精度浮点数和双精度浮点数都是用IEEE 754标准定义的,其中有一些特殊约定,例如:

  1、当P=0,M=0时,表示0。

2、当P=255,M=0时,表示无穷大,用符号位来确定是正无穷大还是负无穷大。

  3、当P=255,M≠0时,表示NaN(Not a Number,不是一个数)。

等等。。。

将二进制转换为 十进制浮点数  单精度

例子:

0x00280000

转换成二进制

00000000001010000000000000000000

符号位 指数部分(8位) 尾数部分

0 00000000 01010000000000000000000

符号位=0;因指数部分=0,则:尾数部分M为:

0.01010000000000000000000=0.3125

该浮点数的十进制为:

(-1)^0*2^(-126)*0.3125

=3.6734198463196484624023016788195e-39

嵌入式学科,float

标准文档 http://754r.ucbtest.org/web-2008/drafts/archive/2006-10-04.pdf


发表评论

全国咨询电话:400-611-6270,双休日及节假日请致电值班手机:15010390966

在线咨询: 曹老师QQ(3337544669), 徐老师QQ(1462495461), 刘老师 QQ(3108687497)

企业培训洽谈专线:010-82600901,院校合作洽谈专线:010-82600350,在线咨询:QQ(248856300)

Copyright 2004-2018 华清远见教育集团 版权所有 ,京ICP备16055225号,京公海网安备11010802025203号