求c语言编程改错

题目1:编程序,由键盘输入10个整数,输出其中偶数之和以及偶数平均值
提示:1)利用单重循环接受从键盘输入,同时判断该数是否为偶数,并累加求和;2)循环体外求平均值,然后将计算结果输出
测试实例:输入12 35 46 4 13 8 72 25 61 82
偶数之和:224
偶数平均值:37.333333

程序:
#include<stdio.h>
void main()
{
int F[10];
int i=0,j=0,m=0,n=0;
float a;
printf("请输入十个整数并以Enter隔开:\n");
for(;i<=9;i++)
{
scanf("%d",&F[i]);
if(F[i]%2==0)
{
m=F[i]+n;
n=m;
j++;
}
}
a=(float)m/j;
printf("偶数之和:%d\n",m);
printf("偶数平均值:%f\n",a);
}
编译链接的时候都没有显示错误,可是运行的结果得37.333332,比题目给的结果小0.000001

题目2:利用公式e≈1+1/1!+1/2!+1/3!+…+1/n!,编程序求e的近似值,直到第n项(1/n!)<10(-6次幂)为止
提示:1)利用二重循环编程实现,其中内层循环求n!,外层循环进行累加求和;2)外层循环终止条件:(1/n!)<10(-6次幂)
测试结果:输出:2.718281

程序:
#include<stdio.h>
void main()
{
float n=1,m=1,j=1,e=1,a;
e=e+1/n;
a=e;
while(1/m>=1e-6)
{
while(n<=j)
{
m=m*(n+1);
n++;
}
j++;
e=1/m+a;
a=e;
}
printf("%f\n",e);
}

编译链接的时候都没有显示错误,可是运行的结果得2.718282,比题目给的结果大0.000001

一直没查出程序哪里有错误,这两个0.000001让我纠结得很。。。

第1个回答  2011-04-23
这是个蛋疼的浮点数精度问题。
别用float了,用double,对用的输出格式控制符要用%lf追问

好吧,大学刚开始学,习惯用float,对double的相关使用就不太了解,写完了程序就发现有这样的错误,后来考虑过精度问题,在第二题的程序里做过实验,就算把开头定义用的float换成double,输出用的%f换成%lf,结果仍然大0.000001,就没在第一题试,刚才试试第一个没问题了,可第二个还是无法输出与题目一样的结果,费解。。。话说double和float使用有什么区别?精度只体现在运算过程中么?输出上来看都是小数点后六位啊。。。

追答

double和float没什么区别,就是double比float精度高,占用的内存空间大的区别。
第二个我猜一下问题所在啊,就是里面的小步骤能用整数型做的时候就用浮点型做,比如他说1/n小于多少就停止,那你就别用1/n控制,换算一下用n控制,当n大于多少就停止。用浮点的步骤越多丢精度丢的越厉害,积少成多到最后结果就体现出不一样了。

本回答被提问者采纳
相似回答