当前位置: 代码迷 >> Java相关 >> 请大家看看这代码为什么会是死循环?
  详细解决方案

请大家看看这代码为什么会是死循环?

热度:145   发布时间:2010-09-29 13:53:50.0
请大家看看这代码为什么会是死循环?
求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);
    }
}
搜索更多相关的解决方案: 代码  

----------------解决方案--------------------------------------------------------
程序代码:
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);在我这是提示错误的,版本问题??
台劳公式我不清楚,不过从结果看,是不是循环里的哪个地方写错了?

----------------解决方案--------------------------------------------------------
泰勒公式cos x=1-x2/2!+x4/4!-x6/6!+x8/8!-…
----------------解决方案--------------------------------------------------------
不好意思,没什么思路
----------------解决方案--------------------------------------------------------
用泰勒公式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 后就会出现死循环呢?看了好久都没有明白过来...请大侠指点。
----------------解决方案--------------------------------------------------------
以下是引用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也会溢出,数据实在太大了
----------------解决方案--------------------------------------------------------
不知道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);
    }
注意导入包,我也不知道是否正确。


----------------解决方案--------------------------------------------------------
cos(-2.1)=-0.50485;
----------------解决方案--------------------------------------------------------
程序代码:
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 编辑 ]
----------------解决方案--------------------------------------------------------
晕,我发完问题都解决了,呵呵,还是用的BigDecimal,学习了
----------------解决方案--------------------------------------------------------
  相关解决方案