我写了一个函数在java中为一个给定的函数找到一个根,它找到了根很好,但是当我去返回根时,它返回我传入函数的m的初始值,而不是最后一个。我在我的函数中添加了一堆print语句以确保达到了值,而且,我的问题是如何从函数中传递m的最新版本而不是最旧版本?我的代码看起来像这样。
public static double bisect (double a, double b, double tolerance)
{
double m = (a+b)/2;
double q = 0;
while(q < tolerance){
if (m*m*m - 2.0*m - 3.0 == 0.0){
return m;
}
else if((a*a*a - 2.0*a - 3.0)*(m*m*m - 2.0*m - 3.0)<0){
q++;
System.out.printf("%1.15f %1.15f %1.15f\n",a,m,b);
b = m;
bisect(a,b,1.0e-10);
}
else if((b*b*b - 2.0*b - 3.0)*(m*m*m - 2.0*m - 3.0)<0){
q++;
System.out.printf("%1.15f %1.15f %1.15f\n",a,m,b);
a = m;
bisect(a,b,1.0e-10);
}
}
return m;
}
我的打印出来就像这样
1.000000000000000 1.500000000000000 2.000000000000000
1.500000000000000 1.750000000000000 2.000000000000000
1.893289196304497 1.893289196304498 1.893289196304499
我删除了介于两者之间的数百个步骤,但1.89是我想达到的值,我该如何解决它?现在它返回1.5,这是我m的初始值。
答案 0 :(得分:3)
bisect
返回一个双精度数。当你在方法中(递归地)调用它时,你不会对返回值做任何事情:
a = m;
bisect(a,b,1.0e-10);
您想要将m的值设置为您返回的值:
a = m;
m = bisect(a,b,1.0e-10);
您可以进一步简化:
m = bisect(m, b, 1e-10);
当我弄清楚它做了什么时,我最终简化了这一点,这是我的简化版本。它可能有用吗?
public static double bisect(double a, double b, double tolerance) {
double m = (a + b) / 2;
double q = 0;
while (q < tolerance) {
if (m*m*m - 2*m - 3 == 0)
return m;
else if ((a*a*a - 2*a - 3) * (m*m*m - 2*m - 3) < 0)
m = bisect(a, m, 1.0e-10);
else if ((b*b*b - 2*b - 3) * (m*m*m - 2*m - 3) < 0)
m = bisect(m, b, 1e-10);
q++;
}
return m;
}