### C语言关键字浅析系列 ###
### ISO/ANSI C 关键字 ###
double关键字声明一种称之为“双精度”的浮点数据类型
其“双”之处在于与float浮点数据类型对比,可以表示更长的数据区间
如果需要表示更大的数值区间还可以采用long double类型
double的作用是:
定义双精度浮点类型。
1、double在系统中的存储
通常double类型的浮点数在系统中占用32位,其中8位用于表示指数和符号,24位表示有效数字(尾数)及其符号
这里所说的两个符号分别指的是指数的正负号和有效数字的正负号
如1.44E-4这个数,用double类型存储时,指数为4,指数符号为负,尾数为1.44,尾数符号为正
2、浮点常量
在C语言中,编写程序时浮点数上的一些缺省是看做有效的
(1)正号可以省略
3.0 4e2 -5e8 -2.54e+2 都正确
(2)可以缺少小数点或指数部分,但二者不能同时缺少
31.4e-1 有小数点和指数部分
3.14159 有小数点,没有指数部分
2e-3 有指数部分,没有小数点
9 既没有小数点也没有指数部分,系统不认为是浮点数类型,定义double的整数常量可写为9.0即可
(3)在有小数点的情况下,可以缺少纯整数部分或者纯小数部分,但二者不能同时缺少
3.14159 存在有效的纯整数部分和纯小数部分
3. 只有纯整数部分,等价于3.0(注意3后面有个小数点,可能不清晰)
.14 只有纯小数部分,等价于0.14(注意1前面有个小数点,可能不清晰)
只有一个小数点时,等于空,并不等于0
【编写程序时还需注意,浮点常量中的字符是连续的,无需在字符e前后加空格】
3、编译器眼中的浮点常量
默认情况下,编译器将浮点常量默认为double类型
这也是为什么一些算法比赛和考试的教材中,极力推荐学生遇到浮点数时尽可能使用double而不是float(当然还有其他因素)
例如,当你这样做这样的处理时:
float area; /* 你有个float类型的变量 */
area = 3.14 * 1.0 * 1.0; /* 3.14和1.0却被认为是double */
结果会正确,因为表达式中的三个默认的double类型浮点数按双精度计算后
得到的double结果再被截为float类型,精度得以保证
然鹅,代价是会减慢程序执行,对于一些对数据处理速度敏感的程序、设备可能不可接受
幸运的是,上面我们说的是默认情况下编译器把浮点常量认为是double,当然也就有自定义型的情况了,比如同样一个数:3.14
(1)31.4e-1 认为是double类型(默认,尾巴很干净)
(2)31.4e-1f或31.4E-1F 认为是float类型(有后缀f/F)
(3)31.4e-1l或31.4E-1L 认为是long double类型(有后缀l/L,建议写L,字体上容易与1区分)
所以当你并不需要double那么长的存储空间,内存敏感的情况下只能接受float的长度时
还是有方法让浮点常量是float类型的(31.4E-1F)
4、浮点数打印格式
float和double在printf()函数中可用%f格式说明符,也可以使用%e格式
区别在于%f是原本的数字形式输出(670.000000),%e是指数计数法形式输出(6.7e8)
long double类型用%Lf和%Le格式说明符
(注:在支持C99的十六进制格式浮点数的系统中,还可以用a/A代替e/E,即%a和%La)
——参考《C Primer Plus第五版》
相关文章:
C语言关键字浅析-float