实型数据平常用的可能不多,有些知识也容易忽略。 实型又叫做浮点数,为什么这样叫我也不知道,:) 老外的叫法吧。
1、根据精度不同,可分为三个子类型:
float类型,占4个字节,有7位有效数字
double类型,占8个字节,有16位有效数字
long double类型,根据编译器的不同,在C中,占10字节,在VC++中,占8字节,和double一样。有更多的有效数字。
注意有效数字是从整数部分开始计算的,有效数字越多,可以精确到小数点后位数也越多,精度越高。
2、表示方法:
1、 十进制小数,如1.5
2、 指数,如1.e10 表示1010
注意E表示的是10,而不是自然对数的底那个E
3、存储方式 字节地址 0 1 2 3 存储方式 S EEEEEEE E MMMMMMM MMMMMMMM MMMMMMMM
float 存储方式:
S为符号位,E为指数,M为小数,数值表示为:(-1)S*2(E-127)*1.M
S为0表示为正数,为1表示为负数。
E为一个字节
M为23位,最高位为0.5,每位之间的倍数为2。
举个例子:
12.0=1*8*1.5
存储在内存中时,S=0,E=130,M=0.5
01000001 |
01000000 |
00000000 |
00000000 |
又如:
12.5=1*8*1.5625
0.5625=0.5+0.0625 double float 类型的存储方式如下,共8个字节: 字节地址 0 1 2 3 存储方式 S EEEEEEE E EEEMMMM MMMMMMMM MMMMMMMM 字节地址 4 5 6 7 存储方式 MMMMMMMM MMMMMMMM MMMMMMMM MMMMMMMM E为指数部分,共11位,M为小数部分,共46位。表达式为: (-1)S*2(E-1023)*1.M 另外还有几点: 1、由于实型数据的计算量比较大,所以一般在单片机编程中要尽量少用。 2、实型常数不分单、双精度,都按双精度double型处理,这点在数学运算中类型转换时需要用到 3、当输出实型数据时,需要注意其精度,会舍去一些数据位,因为机器中存储实型数是采用“逼近法”,用2的指数进行相加而得。 举个例子, #include <iostream.h> } 得到的结果是7383,而不是7384,因为存储的数据实际是7.383XXXX,所以把float转换成int时需要加上0.001,如下: main() }
main()
{
float a=7.384;
int b=a*1000;
cout<<b;
{
float a=7.384;
int b=(a+0.001)*1000;
cout<<b;