浮点型C标准规定的浮点型有float、double、long double,和整型一样,既没有规定每种类型占多少字节,也没有规采用哪种表示形式。浮点数的实现在各种平台上差异很大,有的处理器有浮点运算单元(FPU,Floating Point Unit),称为硬浮点(Hard-float)实现;有的处理器没有浮点运算单元,只能做整数运算,需要用整数运算来模拟浮点运算,称为软浮点(Soft-float)实现。大部分平台的浮点数实现遵循IEEE 754,float型通常是32位,double型通常是64位。
long double型通常是比double型精度更高的类型,但各平台的实现有较大差异。在x86平台上,大多数编译器实现的long double型是80位,因为x86的浮点运算单元具有80位精度,gcc实现的long double型是12字节(96位),这是为了对齐到4字节边界(在第4节 “结构体和联合体”详细讨论对齐的问题),也有些编译器实现的long double型和double型精度相同,没有充分利用x86浮点运算单元的精度。其它体系结构的浮点运算单元的精度不同,编译器实现也会不同,例如PowerPC上的long double型通常是128位。
单精度(float)浮点型
数据浮点型单精度浮点型(float )专指占用32位存储空间的单精度(single-precision )值。单精度在一些处理器上比双度更快而且只占用双精度一半的空间,但是当值很大或很小的时候,它将变得不精确。当你需要小数部分并且对精度的要求不高时,单精度浮点型的变量是有用的。例如,当表示美元和分时,单精度浮点型是有用的。
这是一些声明单精度浮点型变量的例子:float hightemp,lowtemp;
双精度型(double )浮点型
双精度型,正如它的关键字“double ”表示的,占用64位的存储空间。在一些现代的被优化用来进行高速数学计算的处理器上双精度型实际上比单精度的快。所有超出人类经验的数学函数,如sin( ),cos( ) ,和sqrt( )均返回双精度的值。当你需要保持多次反复迭代的计算的精确性时,或在操作值很大的数字时,双精度型是最好的选择。
名称 | 位数 | 数的范围 |
double | 64 | 1,7E–308~1,7E+308 |
float | 32 | 3,4E–038~3,4E+038 |
具体有三种形式:
IEEE754三种浮点数的格式参数
类型 存储位数 偏移值
数符(s) | 阶码(E) | 尾数(M) | 总位数 | 十六进制 | 十进制 |
短实数(Single,Float) | 1位 | 8位 | 23位 | 32位 | 0x7FH,+127 |
长实,数(Double) | 1位 | 11,位 | 52位 | 64位 | 0x3FFH,+1023 |
临时实数(延伸双精确度,不常用) | 1位 | 15位 | 64位 | 80位 | 0x3FFFH,+16383 |
对于阶码为0或为255(2047)的情况,IEEE有特殊的规定:
如果 E 是0 并且 M 是0,这个数±0(和符号位相关) 如果 E = 2 − 1 并且 M 是0,这个数是 ±无穷大(同样和符号位相关) 如果 E = 2 − 1 并且 M 非0,这个数表示为不是一个数(NaN)。
标准浮点数的存储在尾数中隐含存储着一个1,因此在计算尾数的真值时比一般形式要多一个整数1。对于阶码E的浮点型存储形式因为是127的偏移,所以在计算其移码时与人们熟悉的128偏移不一样,正数的值比用128偏移求得的少1,负数的值多1,为避免计算错误,方便理解,常将E当成二进制真值进行存储。例如:将数值-0.5按IEEE754单精度格式存储,先将-0.5换成二进制并写成标准形式:-0.510=-0.12=-1.0×2-12,这里s=1,M为全0,E-127=-1,E=12610=011111102,则存储形式为:
1 01111110 000000=BE000000(16)
这里不同的下标代表不同的进制。
名称 | 位数 | 数的范围 |
double | 64 | 1,7E–308~1,7E+308 |
float | 32 | 3,4E–038~3,4E+038 |