Java 使用近似方法实现sqrt方法。即使条件为false,也无法退出循环
我差一点就要完成我的实际问题了,只是停留在不知道为什么在得到正确的结果后我不能退出循环 该问题要求使用近似方法实现sqrt方法Java 使用近似方法实现sqrt方法。即使条件为false,也无法退出循环,java,infinite-loop,square-root,Java,Infinite Loop,Square Root,我差一点就要完成我的实际问题了,只是停留在不知道为什么在得到正确的结果后我不能退出循环 该问题要求使用近似方法实现sqrt方法 Letnum是应用sqrt方法的数字 对于num>1,lowerLimit=1和upperLimit=number 然后找到下限和上限的中点,即(下限+上限)/2 求出中点的平方,平方中点=Math.pow(中点,2) 如果squareMidpoint>num,上限=中点,否则下限=中点 再次重复第三步,直到获得带有8个有效数字的num 从步骤1到步骤5,我认为我做得正
num
是应用sqrt方法的数字num>1
,lowerLimit=1
和upperLimit=number
下限
和上限
的中点
,即(下限+上限)/2
中点的平方
,平方中点=Math.pow(中点,2)
squareMidpoint>num
,上限=中点
,否则下限=中点
num=4
,程序将永远打印2
。
这是我的密码:
import java.lang.Math;
public class p2q4 {
public static void main(String[] args) {
//Implement the sqrt method using the approximation approach
//initialized lowerLimit and upperLimit
double lowerLimit = 0, upperLimit = 0;
//num is the number to square root.
double num = 5;
//For number greater than one,
if (num > 1) {
lowerLimit = 1; //lower limit to one
upperLimit = num; //upper limit to the number
}
double squareMidpoint;
double midpoint;
do {
//Determine the midpoint between the lower and upper limits
midpoint = (lowerLimit + upperLimit) / 2;
//Evaluate the square of the midpoint
squareMidpoint = Math.pow(midpoint, 2);
//If the square of the midpoint is greater than the number
if (squareMidpoint > num) {
//upper limit to the midpoint
upperLimit = midpoint;
} else {
//lower limit to the midpoint
lowerLimit = midpoint;
}
//for debugging purpose
System.out.printf("midpoint=%f squareMidpoint=%f upperLimit=%f lowerLimit=%f upperLimit/lowerLimit=%f\n", midpoint, squareMidpoint, upperLimit, lowerLimit, upperLimit/lowerLimit);
//even though upperLimit/lowerLimit is '1' but still keep looping
} while (upperLimit/lowerLimit != 1); //I not sure this condition is correct.
//Output
System.out.printf("x = %.0f, root = %f\n", num, midpoint);
}
}
这是我的实际问题:
在数学课上,您没有使用sqrt方法,而是
要求使用近似方法实现sqrt方法
如下所述:
对于大于1的数字,必须首先使用平方根法
将下限设置为1,上限设置为数字(自
数字的平方根始终位于1和数字之间)
然后必须确定下限和上限之间的中点
求出中点的平方。如果中点的平方
大于该数字时,平方根方法必须移动上限
限制到中点,如果中点的平方为
如果小于该数字,则必须将下限移动到中点
移动适当的限制后,必须使用平方根法
评估一个新的中点并重复该过程,直到达到所需的值
获得了精度
双精度浮点数所需的精度为
8位有效数字。任何迭代的精度都可以确定
将两个极限之间的差值除以下限
当该值小于1/108时,限值之间的任何数字都将为A
将数字的平方根估计到所需精度。
为了最小化误差,平方根方法应该返回
满足精度的最终极限之间的中点
要求
对于特殊情况,平方根方法必须返回精确值
零和一
如果应用程序试图计算负数的平方根
数字,平方根方法应显示适当的消息
并终止程序
感谢您的帮助 如果您使用更高的有效数字打印
上限/下限
,您将看到它变小为1.0000000000000002
,但从未达到1,这就是循环从未结束的原因
而不是停留在循环中,只要:
upperLimit/lowerLimit != 1
您应将条件更改为:
while (upperLimit - lowerLimit > 0.0000000001)
当极限值彼此足够接近时,将退出循环
这就是第6步“8位有效数字”的意思——你的近似值应该得到正确的前8位有效数字。在你的代码中,其中
System.out.printf(“中点=%f平方中点=%f上限=%f下限=%f上限/下限=%f\n”,中点,平方中点,上限,下限,上限/下限)代码>你是否得到过上限等于下限?上限将等于下限。输出如下:中点=2.236068平方中点=5.000000上限=2.236068下限=2.236068上限/下限=1.000000中点=2.236068平方中点=5.000000上限=2.236068下限=2.236068下限=2.236068上限/下限=1.000000中点=2.236068平方中点=5.000000上限=2.236068下限=2.236068上限/下限=1.000000不等于1。。它实际上等于1.00000,这可能是您的问题,您将浮点数与整数进行比较,这可能会给出错误的结果SOMG!你救了我一天!我已经解决这个问题5个小时了@PaulFloyd以什么方式?你知道为什么我的输出x=1,root=0.000000
?@Coolwei这是由于if(num>1){
。如果(num>=1){
测试“上限-下限>0.00000001”,则将其更改为if(num>=1){
不合理。像这样的绝对公差的问题是,如果输入非常大,则最小的差异大于公差,如果输入非常小,则所有差异都小于公差。因此,除非您知道输入与1相差不多个数量级,否则您需要引入一些相对的容忍度。