鱼C论坛

 找回密码
 立即注册
查看: 1367|回复: 3

[已解决]两段程序的比较

[复制链接]
发表于 2018-1-9 14:23:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:用π/4 ≈ 1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于10^6为止。
小甲鱼:
#include <stdio.h>
#include<math.h>
void main()
{
    int s;    float n,t,pi;     t=1;pi=0;   n=1.0;    s=1;    
    while( fabs(t) > 1e-6 )    {
        pi = pi+t;   n = n+2;    s = -s;    t = s/n;
   }    
pi = pi*4;     printf(″pi=%10.6f\n″,pi); }
运行结果:pi=3.141594
我:
#include <stdio.h>
#include <math.h>
void main()
{
        double s,k,pi;
        int i,j;
        k=-1.0;       
        i=1;
        j=1;
        s=1.0;
        while(fabs(k/j)>10e-6)
        {       
                j=2*i+1;
                s+=k/j;
                k*=-1;
                i++;
        }
        pi=4.0*s;
        printf("%lf\n",pi);
}
运行结果:3.141613
二者的差别好大,哪位大神能帮忙解释下产生这么大误差的原因出在哪里?为什么小甲鱼的程序最优最接近正确答案?
最佳答案
2018-1-9 17:12:24
①fabs(k/j)>10e-6 判断应该是 1e-6 不是 10e-6
②小甲鱼老师和你的操作有些不一样。小甲鱼老师是先计算 +(k/j)之后再判断  k/(j+2) > 1e-6,而你的是 +(k/j)之后再判断k/j > 1e-6 算法都不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-9 17:12:24 | 显示全部楼层    本楼为最佳答案   
①fabs(k/j)>10e-6 判断应该是 1e-6 不是 10e-6
②小甲鱼老师和你的操作有些不一样。小甲鱼老师是先计算 +(k/j)之后再判断  k/(j+2) > 1e-6,而你的是 +(k/j)之后再判断k/j > 1e-6 算法都不一样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-1-9 19:13:40 | 显示全部楼层
float 与double型数据运算时它们精度相差的问题,精度高系统储存是要求越高,达到时就会舍去。具体我也不太清楚。望有用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-10 09:32:14 | 显示全部楼层
嗯。谢谢您。把10e-6改成了1e-6就得到了3.141595。看来是我实数型数据的表达方法没有学明白。又返工去复习了一下。
另外,好好奇。虽然您的答案最佳,但怎么不像是我评的呢?我失忆了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-16 12:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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