类型 | 字长 | 范围 | 有效数字 | scanf | printf |
float | 32 | -+(1.20* 0 -+inf(正负无穷) nan(非有效数字) | 7位 | %f | %f %e(输出科学计数法) |
double | 64 | -+(2.2* 0 -+inf(正负无穷) nan(非有效数字) | 15位 | %lf | %f %e(输出科学计数法) |
在浮点数中float类型的数字需要f或F后缀来表明
例如:1.23f(1.23F)表示float1.23 ;而1.23表示double类型
如果没有特殊要求一般使用double类型误差一般更小
整数类型永远是准确的数字而浮点数永远存在误差
#include <stdio.h>
int main(){
double a=1234.56789;
printf("%f\n",a);
printf("%e\n",a);
printf("%E\n",a);
return 0;
}
(E+003)或 e+003表示
(E-003)或 e-003表示
输出精度
可以用"%.nf"来输出精确到小数点后n位,此方法存在四舍五入
int main()
{
printf("%.3f\n",-0.0049);
printf("%.30f\n",-0.0049);
printf("%.3f\n",-0.00049);
return 0;
}
在数学中任意两个数字之间是连续的,但是在计算机中任意两个数之间不连续,所以计算机会选择最相近的数字输出,此为浮点数的误差 。
+-inf(超过范围的浮点数)和 nan(不存在的浮点数)
#include <stdio.h>
int main()
{
printf("%f\n",12.0/0.0);
//结果是正无穷大
printf("%f\n",-12.0/0.0);
//结果是负无穷大
printf("%f\n",0.0/0.0);
//结果是nan
}
以上代码仅适用于浮点数,在整数范围内0不能做除数,程序会报错
#include <stdio.h>
int main()
{
float a,b,c;
a=1.345f;
b=1.123f;
c=a+b;
if(c==2.468)
printf("相等");
else
printf("不相等 c=%.10f,c=%f\n",c,c);
return 0;
}
综上:直接用两个浮点数判断是否相等很大概率是失败的
一般用 fabs 取绝对值然后设定允许范围内的误差进行比较 fabs(f1-f2)<1e-12()