| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1554 人关注过本帖
标题:请大家看看这代码为什么会是死循环?
只看楼主 加入收藏
Crocodile_JX
Rank: 5Rank: 5
等 级:职业侠客
帖 子:161
专家分:335
注 册:2010-9-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:12 
请大家看看这代码为什么会是死循环?
求cos(-2.1)的值,是用台劳公式计算的。为什么会是死循环?应该怎么样改?请大家帮忙看看...谢谢
import java.lang.Math;
class  Crocodile
{
    public static void main(String[] args)
    {
        float x=-2.1f;
        float value,item;   
        float numerator;   
        int denominator;   
        int s,i,j;
        
        value=0;
        item=1;
         
        numerator=1;
        denominator=2;
        j=denominator;
        while(Math.abs(item)>=1e-5)
        {
          value=value+item;
          numerator=-numerator*x*x;
         
          s=1;
         
         for(i=1;i<=j;i++)
              s=i*s;
              
         
          j=j+2;
          denominator=s;
          item=numerator/denominator;
         
                  }
        System.out.printf("%.5f",value);
    }
}
搜索更多相关主题的帖子: 代码 
2010-09-29 13:53
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:0 
程序代码:
1.0:1.0E-5
2.2049997:1.0E-5
0.81033736:1.0E-5
0.11911959:1.0E-5
0.009380667:1.0E-5
4.5965263E-4:1.0E-5
1.5356574E-5:1.0E-5
2.5364008E-5:1.0E-5
7.1378876E-5:1.0E-5
7.0220063E-4:1.0E-5
0.0013235044:1.0E-5
0.02347248:1.0E-5
0.06973182:1.0E-5
0.12871198:1.0E-5
0.7649023:1.0E-5
3.2929041:1.0E-5
9.529869:1.0E-5
Infinity:1.0E-5
Infinity:1.0E-5
Infinity:1.0E-5
Infinity:1.0E-5
......
我在while里加了一句
double da = 1e-5;
System.out.println(Math.abs(item)+":"+da);
上面就是我运行的结果,后面是无穷无尽的Infinity:1.0E-5
不过你最后行的System.out.printf("%.5f",value);在我这是提示错误的,版本问题??
台劳公式我不清楚,不过从结果看,是不是循环里的哪个地方写错了?

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-29 16:10
Crocodile_JX
Rank: 5Rank: 5
等 级:职业侠客
帖 子:161
专家分:335
注 册:2010-9-13
收藏
得分:0 
泰勒公式cos x=1-x2/2!+x4/4!-x6/6!+x8/8!-…
2010-09-29 17:48
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:0 
不好意思,没什么思路

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-29 18:14
Crocodile_JX
Rank: 5Rank: 5
等 级:职业侠客
帖 子:161
专家分:335
注 册:2010-9-13
收藏
得分:0 
用泰勒公式cos x=1-x2/2!+x4/4!-x6/6!+x8/8!-…  (x2表示x的平方,x3表示 x的三次方……)求x=-2.1时 cos (-2.1)的值。保留5位小数...
大方向没有错,就是在求分母的阶乘时出了问题,要把s的值重新设为1,可是在while循环上加 了 s=1 后就出现了死循环。不加的话就不会出现这种情况,但是得不到正确的结果。可是不知道 为什么加了 s=1 后就会出现死循环呢?看了好久都没有明白过来...请大侠指点。
2010-09-29 19:14
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
收藏
得分:10 
以下是引用Crocodile_JX在2010-9-29 19:14:16的发言:

用泰勒公式cos x=1-x2/2!+x4/4!-x6/6!+x8/8!-…  (x2表示x的平方,x3表示 x的三次方……)求x=-2.1时 cos (-2.1)的值。保留5位小数...
大方向没有错,就是在求分母的阶乘时出了问题,要把s的值重新设为1,可是在while循环上加 了 s=1 后就出现了死循环。不加的话就不会出现这种情况,但是得不到正确的结果。可是不知道 为什么加了 s=1 后就会出现死循环呢?看了好久都没有明白过来...请大侠指点。

int s 早就溢出了
而且就算double也会溢出,数据实在太大了
2010-09-29 19:58
shellingford
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:19
帖 子:228
专家分:1348
注 册:2010-8-9
收藏
得分:0 
不知道cos(-2,1)是多少呢,好久没碰过数学了
程序代码:
    public static void main(String[] args) {
        BigDecimal x=new BigDecimal("-2.1");
        BigDecimal value=new BigDecimal("0");
        BigDecimal item=new BigDecimal("1");
        BigDecimal numerator=new BigDecimal("1");
        BigDecimal denominator=new BigDecimal("2");
        int j=2;
        BigDecimal s=new BigDecimal("0");
        BigDecimal out=new BigDecimal("1e-5");
        int i;
        while (item.abs().compareTo(out)>=0) {

            value = value.add(item);
            numerator = numerator.multiply(x).multiply(x).multiply(new BigDecimal("-1"));

            s = new BigDecimal("1");

            for (i = 1; i <= j; i++)
                s = s.multiply(new BigDecimal(i));

            j = j + 2;
            denominator = s;
            item = numerator.divide(denominator,BigDecimal.ROUND_HALF_DOWN);

        }
        System.out.println(value.toString());
        System.out.printf("%.5f", value);
    }
注意导入包,我也不知道是否正确。

2010-09-29 20:08
Crocodile_JX
Rank: 5Rank: 5
等 级:职业侠客
帖 子:161
专家分:335
注 册:2010-9-13
收藏
得分:0 
cos(-2.1)=-0.50485;
2010-09-29 20:12
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:10 
程序代码:
s的值是为2
s的值是为24
s的值是为720
s的值是为40320
s的值是为3628800
s的值是为479001600
s的值是为87178291200
s的值是为20922789888000
s的值是为6402373705728000
s的值是为2432902008176640000
s的值是为-1250660718674968576
。。。
s的值是为0
将item = numerator / denominator;改为item = item + numerator / denominator;
打印s的结果如上。
应该就是s的值的问题,超过了int的范围,上面我测试是用的long类型,不过还是超了,
这样虽然不是无限循环了,但是结果显然不是正确的,
用java.math.BinInteger类或者java.math.BigDecimal类??
我也没有好的思路,如果是因为我说这个原因,那换成大整型或者大数字类应该就没问题了,不过我对这两个类也不是很熟,你查查吧


[ 本帖最后由 syg5434 于 2010-9-29 20:28 编辑 ]

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-29 20:16
syg5434
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:山沟沟
等 级:版主
威 望:10
帖 子:285
专家分:781
注 册:2010-2-28
收藏
得分:0 
晕,我发完问题都解决了,呵呵,还是用的BigDecimal,学习了

不要迷恋哥,嫂子会揍你。阿-弥-陀-佛--!
2010-09-29 20:23
快速回复:请大家看看这代码为什么会是死循环?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037795 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved