QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1869|回复: 11

请教各位高手一个简单的C语言问题!!!!

[复制链接]
发表于 2002-8-13 10:43:30 | 显示全部楼层 |阅读模式
:-(
我在编写一个数值计算的程序时遇到这样一个问题:
    我欲对
两数求平均,然后四舍五入取两位有效数字。结果总是出现误差
下面是一个简单的程序代码,请帮我看看有没有问题:
#include <stdio.h>
#include <math.h>

main( )
{
     float r0, r1, r2, r3;
     
     printf("Enter two float numbers:\n");
     scanf("%f%f",&r0,&r1);   
        
      r2=(r0+r1)/2.0;

      r3=floor(r2*100.0+0.5)/100.0;

      printf("r2=%f,  r3=%f\n",r2,r3);
   
      return 0;
}

我用了三对数:
                     0.82,1.77  结果:1.29   应为:1.30
                     1.17,0.96  结果:1.06   应为:1.07
                     4.71,3.76  结果:4.24   应为:4.24
然后我又将程序中的float类型改为double类型
                     0.82,1.77  结果:1.30   应为:1.30
                     1.17,0.96  结果:1.07   应为:1.07
                     4.71,3.76  结果:4.23   应为:4.24
发表于 2002-8-13 19:04:57 | 显示全部楼层

没办法

我编译时说floor未定义...没办法了
回复

使用道具 举报

 楼主| 发表于 2002-8-14 10:08:43 | 显示全部楼层

谢谢,黑企鹅!

在linux系统下编译带有math.h头文件的c语言程序,要加-lm选项。
那你程序是怎么写的?能贴出来吗?谢谢!
回复

使用道具 举报

发表于 2002-8-14 19:52:36 | 显示全部楼层

试试

我试着把r3的计算步骤分开,好像能得正确结果.
可以在其中加一些打印信息的语句.

#include <stdio.h>
#include <math.h>

main( )
{
float r0, r1, r2, r3;

printf("Enter two float numbers:\n");
scanf("%f%f",&r0,&r1);

r2=(r0+r1)/2.0;

r3=r2*100.0;
printf("r2=%f, r3=%f\n",r2,r3);

r3=r3+0.05
printf("r2=%f, r3=%f\n",r2,r3);

r3=floor(r3)/100.0;
/*r3=floor(r2*100.0+0.5)/100.0;*/

printf("r2=%f, r3=%f\n",r2,r3);

return 0;
}
回复

使用道具 举报

 楼主| 发表于 2002-8-14 21:34:23 | 显示全部楼层

还不行!

谢谢,可惜用0.96和1.17试,仍有误差。 :-(
回复

使用道具 举报

发表于 2002-8-20 18:12:57 | 显示全部楼层

it will be correct like this:)

#include <stdio.h>
#include <math.h>

int main(void )
{
float r0, r1, r2, r3;

printf("Enter two float numbers:\n");
scanf("%f%f",&r0,&r1);

r2=(r0+r1)/2.0;

r3=floor(r2*100.0+0.6)/100.0;

printf("r2=%3.3f, r3=%3.2f\n",r2,r3);

return 0;
}
回复

使用道具 举报

 楼主| 发表于 2002-9-6 19:31:43 | 显示全部楼层

谢谢oilz,不过你的方法还是有问题!

其实问题的关键是实数在内存中的近似表示。
后来,我每次四舍五入后,都进行判断,有误差的进行进一步的处理。
回复

使用道具 举报

发表于 2002-11-22 20:09:34 | 显示全部楼层
不是算法的问题,在C里面,截取数位的时候,不是四舍五入,而是向零靠近,1.999小数点后保留两位是1.99,而不是2.00
回复

使用道具 举报

发表于 2002-11-22 20:54:32 | 显示全部楼层
对,moonsky说的对,应该对结果做一个判断,如果要舍的那一位大于等于5,那么就加5再显示,结果应该会对的
回复

使用道具 举报

发表于 2002-11-23 13:59:37 | 显示全部楼层
Have you tried the round() function?  Use r3 = round(r2 * 100.0) / 100.0 and see what you get.
回复

使用道具 举报

发表于 2002-11-23 19:14:50 | 显示全部楼层

Re: 谢谢oilz,不过你的方法还是有问题!

[quote:ff111d59cd="Xunil"]其实问题的关键是实数在内存中的近似表示。
后来,我每次四舍五入后,都进行判断,有误差的进行进一步的处理。[/quote]
可以把修改好的正确的程序贴出来,大家看看?
回复

使用道具 举报

发表于 2002-11-23 20:17:14 | 显示全部楼层

Re: 谢谢oilz,不过你的方法还是有问题!

[quote:3d399847ce="netdigger"][quote:3d399847ce="Xunil"]其实问题的关键是实数在内存中的近似表示。
后来,我每次四舍五入后,都进行判断,有误差的进行进一步的处理。[/quote]
可以把修改好的正确的程序贴出来,大家看看?[/quote]
不同的机器上面处理方式不同,你的这种方法可能最好了,解决了移植问题,程序贴出来大家看看!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-16 19:44 , Processed in 0.044605 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表