关于C语言编程,相对误差,绝对误差

关于C语言编程,相对误差,绝对误差,第1张

绝对误差好像要取绝对值吧。。。。如果不需要就自己去掉下。。。
#include<stdioh>
#include<stdlibh>
#include<mathh>
void main()
{
float sj[100],cc[100],xd[100],jd[100];
double pj_xd=0,pj_jd=0;
int i,j,n=0;
printf("\t请依次输入每个西瓜的实际重量和猜测重量(以-1结束)\n");
while (1)
{
printf("\n\t请输入第%d个西瓜的实际重量和猜测重量:",n+1);
scanf("%f",&sj[n]);
if (sj[n]==-1) break;
scanf("%f",&cc[n]);
if (cc[n]==-1) break;
n++;
}
for(i=0;i<n;i++)
{
xd[i] = fabs(cc[i]-sj[i]);
jd[i] = xd[i]100/ sj[i] ;
pj_xd+=xd[i];
pj_jd+=jd[i];
}
printf("\n\t\t\t相对误差 \t绝对误差\n\n");
for (i=0;i<n;i++)
printf("\t第%d个西瓜:\t%f \t%5f%c\n",i+1,xd[i],jd[i],'%');
printf("\n\t平均误差:\t%lf \t%5lf%c\n\n",pj_xd/n,pj_jd/n,'%');
system("pause");
}

#include<stdioh>
main()
{
float
a,b;
int
c;
printf("1求平均值\n2求相对误差\n");
to:scanf("%d",&c);
if(c==1)
{
printf("输入两个数:");
scanf("%f%f",&a,&b);
printf("平均值是:%2f",(a+b)/20);
}
else
if(c==2)
{
printf("输入测量值和真实值:");
scanf("%f%f",&a,&b);
printf("相对误差是:%2f",a-b>0(a-b)/b:(a-b)-1/b);
}
else
{
printf("重新输入\n");
goto
to;
}
}

这就是传说中的浮点运算误差了,而且这种误差是会累积的,比如你说average3是712,但它的实际值很可能不是712,而是稍微小一点点,但电脑仍然按712显示,然后再次01,误差再一次放大,电脑就hold不住了,只好显示为71199997。
可以试着增加浮点数的精度,float是单精度浮点数,可改为double双精度浮点数,这样可以大大降低误差。

这是在算除法时出现小数精度不足的问题,但这个题目的答案应该是20081/22/33/42008/2009
因为你是说第2008次,那分子是2008才对。如果你算到1只是算到2007次。
最后结果应该是2008/2009≈099950223992035838725734196117471
而你程序中的printf("%125f",n);中的“%125f”不起作用,如果改成“%f”结果是0999502,如果改成“%2f”结果就是100

printf("%f\n",3/2);
printf("%f\n",1/33);
整型表达式运算结果为整型,这时用 %f 格式 输出 语法上是错误的。你要改成:
printf("%f\n", (float)(3/2));
printf("%f\n",(float)(1/33));
---
float 精度只有7位有效数字。只有“截断误差”-- 只有舍,没有入。四舍五入 要自己处理,也可用 mathh 里的 地板,天花板函数处理。
848是 2进制到十进制转换结果。机器内部是2进制数(按IEEE标准存放)

由于计算机中浮点数是二进制形式的,它无法准确表示十进制中的大部分小数,就像十进制科学计数法不能准确表示1/3,而只能近似表示成033333一样。
676这个数无法准确地用浮点数表示,只能近似到6759999或67600000x。

题目写错了吧,你的思路不错,可以先排序再去头尾,取中间和求平均。

但题目中n是表示数组长度,你在函数中完全没用到。其次求平均建议先算总和再除,你每次先除再累加,不能整除每次都有误差。

可以改成这样:

我重新看了下你代码,1、t要改成double。2、j循环初值要写i+1不是1(j对应i后一个开始)。

double fun(double a[],int n)

{

  double sum=0,t;

  int i,j;

  for(i=0;i<n;i++)

      for(j=i+1;j<n;j++)

          if(a[i]>a[j])

              t=a[i],a[i]=a[j],a[j]=t;

  for(i=0;i<n;i++)

      printf("%1lf ",a[i]);

  printf("\n");

  for(i=1;i<n-1;i++)

      sum+=a[i];

  return sum/(n-2);

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/13337131.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-31
下一篇2025-08-31

发表评论

登录后才能评论

评论列表(0条)

    保存