请大家看看这代码为什么会是死循环?
求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里加了一句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
......
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 后就会出现死循环呢?看了好久都没有明白过来...请大侠指点。
用泰勒公式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);
}
注意导入包,我也不知道是否正确。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的值是为24
s的值是为720
s的值是为40320
s的值是为3628800
s的值是为479001600
s的值是为87178291200
s的值是为20922789888000
s的值是为6402373705728000
s的值是为2432902008176640000
s的值是为-1250660718674968576
。。。
s的值是为0
打印s的结果如上。
应该就是s的值的问题,超过了int的范围,上面我测试是用的long类型,不过还是超了,
这样虽然不是无限循环了,但是结果显然不是正确的,
用java.math.BinInteger类或者java.math.BigDecimal类??
我也没有好的思路,如果是因为我说这个原因,那换成大整型或者大数字类应该就没问题了,不过我对这两个类也不是很熟,你查查吧
[ 本帖最后由 syg5434 于 2010-9-29 20:28 编辑 ]
----------------解决方案--------------------------------------------------------
晕,我发完问题都解决了,呵呵,还是用的BigDecimal,学习了
----------------解决方案--------------------------------------------------------