浮点数

对于金融、数学等行业对于数字的要求更高所以使用浮点数。

优势:浮点数可以表示包括小数在内的更大范围的数。

使用类型:float,double,long double

 计数法:一般计数法、科学记数法、指数计数法(e后面的数字表示10的指数)

声明方式 (与整数类型相同)

float noah,jonah;
double trouble;
float planck=6.63e-34;
long double gnp;

ps:

①e或E都可以

②浮点数常量多种表示方式省略小数点(2E5)、省略指数部分(19.57)、省略小数部分(3.E16)、省略整数部分(.4E23)但是不可以同时省略两部分。

③浮点型常量之间不可以加空格

④一般情况下编译器默认浮点型常量是double类型的精度,可以在数据后加上后缀覆盖默认设置的double精度。加f或F编译器会看做float类型,加l或L编译器会看做long double类型。

⑤C99还添加了十六进制表示浮点数,但并非所有编译器适配,不多赘述。

打印浮点数

%f打印十进制的float和double类型浮点数,用%e打印指数型计数法的浮点数。

#include <stdio.h>
int main(void)
{
float about=32000.0;
double abet=2.14e9;
long double dip=5.32e-5;

printf("%f 可以写成 %e\n",about,about);
printf("%f可以写成%e\n",abet,abet);
printf("%Lf可以写成%Le\n",dip,dip);
return 0;
}

浮点值的上溢和下溢

上溢:当计算量超过当前类型所能表达的最大范围,就会发生上溢。现在会给其赋一个表示无穷大的特定值,所以printf()显示的值一般表示为inf或infinity(或者其他可以表示无穷含义的内容)。

#include <stdio.h>
int main(void)
{
float about=3.4E38;
float bit=3.4E38*100.0f;

printf("about is %e\n",about);
printf("bit is %e",bit);
return 0;
}

下溢:对于一个十进制的有效数字(如,0.1234e-10)除以10,得到的结果是0.123e-10。虽然得到了结果但是计算过程中损失了末尾原有的有效数字,此情况成为下溢。下溢会造成精度损失,C语言把损失了类型全精度的浮点值称为低于正常的浮点值。

#include <stdio.h>
int main(void)
{
float a=1.4E-45;
float b=1.4E-45/2;

printf("a is %e\n",a);
printf("b is %e",b);
return 0;
}

特殊的浮点值nan(not a number):例如给asin()函数传递一个值可以输出一个角度,但是正弦值不能大于1,如果输入一个大于1的值,则该函数的行为未定义返回值为nan。

浮点数舍入错误

#include <stdio.h>
int main(void)
{
float a,b;

b=2.0e20+1.0;
a=b-2.0e20;
printf("%f\n",a);

return 0;
}

该情况是由于计算机缺少足够的位数来进行运算。

参考文献C primer plus