上一篇总结了c的基本数据类型中的int, char,以及其衍生出的short, long, long long,配合前缀usigned,signed使用,可以表示占用不同储存空间的数据类型。现在继续讨论c中存在的浮点数据类型。
浮点数据表示方式
浮点类型数据在电脑中的表示方式与整数数据类型有所区别。它使用e计数法,此计数法分为指数部分和非指数部分及符号,例如,
5.221*10^2次方
在电脑中,将其表示为+5.221e2.
在使用此方法时,可以省略其指数部分,例如,
522.1
可省略小数点,如,
2.0e2可写成2e2
但是不可同时省略两者,如,
5.221e2.写成5221
同时,也可省略其小数部分和整数部分,但不可同时省略,如,
.221e2
或
5.e2
(此处我觉得省略后小数点之前或之后位的数值当作0处理了)
浮点类型数据除了在表达方式上和整数数据类型不同外,还在表示数据的精度上有所不同。整数是无法表示小数点以后的数字的,要没会四舍五入要么就会被截掉,这样造成了数据的精确性不够,而浮点类型数据可以较好的解决这个问题。
根据所能表示的数据的精度不同和对储存空间大小的不同浮点数据类型又分为 float和double。
浮点数据类型
float
float能表示至少6位有效数字,最小取值范围为10的负37次方到10的正37次方。(此处就不推算了,推算方法与int取值范围类似)一般来说,系统储存一个float类型需要32位的储存空间,和储存一个long的空间一致。但是与其不同的地方是,浮点类型数据需要8位来储存其指数部分和其符号,剩余24位储存非指数部分及其符号
double
double能表示至少10位有效数字,其最小取值范围和float一样,(但两者的取值范围随着操作系统的不同会发生改变,所以不是定数。),一般来说,一个double类型的浮点数据类型需要64位。比float多出来的位数有些操作系统会分配给指数部分以达到可以表示更大取值范围的目的,有些操作系统会分配给非指数部分以提高数据精度。,所以一句话总结,一般情况下,double所占用储存空间大于float,其取值范围和精度也大于float。
需要注意的是,在为声明浮点数据时,电脑自动将其处理为double类型,如需改变其默认方式,需在数据后加f或F后缀。如,
#include<stdio.h>
main()
{
float m,
m=2.3*3.2;
printf("%f",m);
}
此程序中计算m时,电脑是把2.3和3.2当作doubel类型进行储存和计算的,这样所占储存空间相对较大计算速度也会更慢,但是当数据有很多小数部分时,结果会相对精确。算出结果后,电脑会将其截断成float形式已对应所声明的数据类型。
输出
使用转换符号%f输出出十进制下的浮点数据,使用%e输出e计数法下的浮点数据,如需输出long double 或者long float类型,可在转换符前加L配合使用,如%Lf,%Le。c99标准还提供了以16进制表示和输出浮点数的方法(这个我仍在琢磨中,目前仍在理论学习中,实践中还未遇到16进制输入情况,所以以后我才能更有感悟吧)
输出报错情况
当计算过程中,如果计算结果超出float或者double类型储存大小,称为overflow,此时输出显示的将会是inf(infinity),反之造成的数据丢失称为underflow。此时虽然得到结果但是会不精确。
complex&imaginary
此外c中还存在complex和imaginary数据类型,表示复数与虚数。
其类型细分为,
float_complex
double_complex
long double_complex
float_imaginary
double_imaginary
long double_imaginary