打印

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

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

:-(
我在编写一个数值计算的程序时遇到这样一个问题:
    我欲对
两数求平均,然后四舍五入取两位有效数字。结果总是出现误差
下面是一个简单的程序代码,请帮我看看有没有问题:
#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

TOP

没办法

我编译时说floor未定义...没办法了
Debian when u r sa(i)d, u r unstable 有三件事具有生命的意义。它们是你生活当中所有事情的动机,包括你所做的任何事情和一个生命体该做的所有事情。[X] 第一是生存,[...] 第二是社会秩序,[ ] 第三是娱乐。---Linux Tovarlds (Just For Fun)

TOP

谢谢,黑企鹅!

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

TOP

试试

我试着把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;
}
Debian when u r sa(i)d, u r unstable 有三件事具有生命的意义。它们是你生活当中所有事情的动机,包括你所做的任何事情和一个生命体该做的所有事情。[X] 第一是生存,[...] 第二是社会秩序,[ ] 第三是娱乐。---Linux Tovarlds (Just For Fun)

TOP

还不行!

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

TOP

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;
}

TOP

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

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

TOP

不是算法的问题,在C里面,截取数位的时候,不是四舍五入,而是向零靠近,1.999小数点后保留两位是1.99,而不是2.00
萝卜青菜,各有所爱,我就爱Linux! 神话有3种,第一种神话,第二种台湾独立,第三种台湾反攻大陆.

TOP

对,moonsky说的对,应该对结果做一个判断,如果要舍的那一位大于等于5,那么就加5再显示,结果应该会对的
生命不息,编程不止 有没有人一起研究PAX255啊

TOP

Have you tried the round() function?  Use r3 = round(r2 * 100.0) / 100.0 and see what you get.

TOP

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

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

TOP

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

[quote:3d399847ce="netdigger"][quote:3d399847ce="Xunil"]其实问题的关键是实数在内存中的近似表示。
后来,我每次四舍五入后,都进行判断,有误差的进行进一步的处理。[/quote]
可以把修改好的正确的程序贴出来,大家看看?[/quote]
不同的机器上面处理方式不同,你的这种方法可能最好了,解决了移植问题,程序贴出来大家看看!
萝卜青菜,各有所爱,我就爱Linux! 神话有3种,第一种神话,第二种台湾独立,第三种台湾反攻大陆.

TOP