第四节 浮点数类型
浮点数类型 浮点型常数的表示方法 有两种表示形式: (1)十进制小数表示法: 与数学中实数写法相同。 如0.1、123.456等 (2)指数表示法(科学表示法): 如0.5E4、0.1234E-6、0.789e2等都是合法的。它们的含义分别是: 0.5×104 0.1234×10-6 0.789×102
浮点数类型 浮点型数据的存放方式 一个浮点float型数据一般在内存中占4个字节(32位)。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。分成尾数和指数两部分。 x 127+y 符号 0/1 尾数部分 1.x 指数 2y
浮点数类型 浮点型变量的分类 分为三类: 单精度( float型 ) 双精度( double型 ) 长双精度( long double型 )
浮点数类型 仅以某种机器为例! float double long double long double一般不支持! 类 型 占存储空间 类 型 占存储空间 有效数位数 数 值 范 围 float 4个字节 6 ∽ 7 -3.4×10-38 ∽ 3.4×1038 double 8个字节 15 ∽ 16 -1.7×10-308 ∽ 1.7×10308 long double 16个字节 18 ∽ 19 -1.2×10-4932 ∽ 1.2×104932 仅以某种机器为例! long double一般不支持!
浮点数类型 浮点型数据表示误差 由于浮点型变量存放在有限的几个字节的存储单元中,所以能提供的有效数字总是有限的,因此有效位以外的数字将被舍去,由此会产生误差。 即:浮点数的表示是不精确的!
浮点数类型 浮点型数据表示误差 例: int main() { double a; a=0.1; printf("a=%.17f\n",a); … } 运行结果为: a=0.100000000000000001 由于一个double变量只能保证16位有效 数字,所以后面的数字是无意义的。 类似的还有1.0/3*3 结果并不一定等于1。
浮点数类型 例: int main() 浮点型数据表示误差 { double a,b; b = 2.0e20 + 1.0; a = b - 2.0e20; printf("%f \n", a); } VC运行结果为: 0.000000
浮点数类型 浮点型常量的类型 浮点型常量的类型为double,而不是float。 例如: float f; 系统将2.45678和4523.65按double数据存储和运算,得到一个double的乘积,然后取前7位赋值给float变量f,这样做的目的是为了保证计算结果更精确。但是运算速度降低了。可以在浮点型常量的后面加上字符f或F(如2.45678f、4523.65F),此时编译系统会按float处理它们
浮点数类型 浮点型变量的溢出 浮点型变量的溢出(overflow)和下溢 (underflow) 一个double型的变量最大允许值为DBL_MAX(定义在float.h中)(如:1.7976931348623157e+308),最小正值为DBL_MIN(如:2.2250738585072014e-308),如果超出范围就会出现上溢或下溢的错误情况
浮点数类型 浮点型变量的上溢 double toobig = DBL_MAX * 100.0; printf("%e\n", toobig); 32位系统中的运行结果为: 1.#INF00e+000
浮点数类型 浮点型变量的上溢 double toosmall = DBL_MIN / 1E30; printf("%e\n", toosmall); 32位系统中的运行结果为: 0.000000e+000