浮点常量
(1)表示方法
1.十进制小数形式。
2.指数形式。如123e6,注意,e前必须有数字,e后必须为整数。e前的小数部分中,若小数点左边有且仅有1位非零数字,则为规范化指数形式。
(2)类型
默认作为双精度处理,一般占用 8 Bytes 内存。
浮点变量
(1)类型
1.float一般占 4 Bytes 内存。
2.double一般占8 Bytes 内存。
(2)精度(误差)
浮点型数据能够保证的有效位数是24位,24位之后的数字对于该浮点数是无意义的。
机内表示
(1)转换
十进制的浮点数要转换成二进制的浮点数(计算机内部,浮点数都是以二进制表示的),要分为两步:
1.小数部分的转换——“乘2取整”(由高位向低位)
0.8125 = 0.1101b
0.8125*2 =1.625 0.1
0.6250*2 =1.250 0.11
0.2500*2 =0.500 0.110
0.5000*2 =1.000 0.1101
2.整数部分的转换——“除2取余”(由低位向高位)
(2)规格化
通过调整浮点数的阶码是该数的有效值在1与2之间,如:0.8125 = 0.1101b = 1.101*2^(-1).
(3)表示
按照 IEEE 754 标准,二进制float型浮点数在机内分为三段:
1.符号段 —— 1 bit,正数为0,负数为1
2.阶码段 —— 8 bit,值为-126~127,另两个值,-127和-128表示特殊数,-127表示非规规格化数(有效值不省略小数点前面的1,只用23位尾数),-128表示NaN。为使浮点数0和整数0统一,位码全0表示0,机内表示的阶码会对正常二进制数的阶值做+127的偏移。
3.尾数段 —— 23 bit,由于规格化之后小数点左边1位必定为1(除了0),故该位有效数字信息产生冗余,可选小数点之后23位作为尾数段,精度仍有24位。
如:35.6 = 100011 .1001 1001 1001 1001...b
= 1 .00011 1001 1001 1001 1001 10 * 2^5
= 01000 0100 00011 1001 1001 1001 1001 10
1000 0100阶值为 1000 0100b - 127 = 5, 表示小数点左边为1,右边为尾数段,阶数 5 的小数。
0 = 0 0000 0000 00000 0000 0000 0000 0000 00
0000 0000 阶值为 0000 0000b - 127 = -127,表示小数点左边为0,右边为尾数段,阶数为 -127 的小数,这里为0。
附:查看float型数据的机内码程序
#include<iostream> using namespace std; int main() { float f=35.6f; unsigned int * pa =reinterpret_cast<unsigned int*> (&f); for(int i=31;i>=0;i--) cout<<(*pa>>i&1)<<(i==31||i==23?" ":""); getchar(); return 0; }
结果:
float与零值的比较
float与零值比较是要考虑精度的,不能直接判断一个float值是否等于0,不要将很大的浮点数和很小的浮点数做运算,结果会让人大吃一惊。