题目
7-8 实验2_3_表达式求值一
有表达式如下:
a / ( b * c - d )
请按要求计算 。
输入格式:
只有一行,为4个用空格分隔的浮点数,依次代表a,b,c,d(请用double 类型存储)。
输出格式:
如果除数为0,则输出error,否则输出该表达式的值(保留1位小数)。
输入样例:
66.09 7.7 3.5 1.6
输出样例:
2.6
解决方案
第一版:80pts
#include<stdio.h>
int main()
{
double a,b,c,d;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double t=b*c-d;
if(t==0) printf("error");
else printf("%.1f",a/t);
return 0;
}
五个点过了四个。
有趣的地方就是判断除数是否为零。
在C、C++等语言中,float、double的浮点类型会有精度问题(具体原理我研究清楚后再更新到这里),实际储存的数值与输入数值并非完全相同。故如果直接比较是否相等,结果并不符合预期。
因此我们在比较浮点数大小时可以运用极限的思想:若两数差值小于一个“足够小的数”,那么我们便可认为两数相等。
在C语言中,float.h头文件定义了这个“足够小的数”->DBL_EPSILON(实际还有FLT_EPSILON、LDBL_EPSILON,分别代表了不同浮点类型的“足够小的数”)。又因为我们无法确定两数较大值,故我们可以计算出差值后用math.h头文件提供的fabs()函数取绝对值再进行比较。
最终版:100pts
#include<stdio.h>
#include<math.h>
#include<float.h>
int main()
{
double a,b,c,d;
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
double t=b*c-d;
if(fabs(t-0)<DBL_EPSILON) printf("error");
else printf("%.1f",a/t);
return 0;
}
如有错误,敬请指正
[编程]C/C++表达式求值及浮点精度处理,
讨论了C/C++中如何精确处理浮点数表达式求值,避免除以零的错误,以及使用DBL_EPSILON处理浮点精度问题。
1375





