实型数据平常用的可能不多,有些知识也容易忽略。 实型又叫做浮点数,为什么这样叫我也不知道,:) 老外的叫法吧。
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、存储方式
float 存储方式:
字节地址 | 0 | 1 | 2 | 3 |
存储方式 | S EEEEEEE | E MMMMMMM | MMMMMMMM | MMMMMMMM |
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>
main()
{
float a=7.384;
int b=a*1000;
cout<<b;
}
得到的结果是7383,而不是7384,因为存储的数据实际是7.383XXXX,所以把float转换成int时需要加上0.001,如下:
main()
{
float a=7.384;
int b=(a+0.001)*1000;
cout<<b;
}