[英]Implement sqrt method using the approximation approach. Cannot exit loop even the condition is false
我是如此接近完成我的实际问题,只是坚持不知道为什么我得到正确的结果后无法退出循环。
问题要求使用近似方法实现sqrt方法。
num
是应用sqrt方法的数字。 num> 1
, lowerLimit = 1
和lowerLimit = 1
upperLimit = number
midpoint
的lowerLimit
和upperLimit
其是(lowerLimit+upperLimit)/2
midpoint
, squareMidpoint = Math.pow(midpoint, 2)
squareMidpoint > num
, squareMidpoint > num
upperLimit = midpoint
,则lowerLimit= midpoint
。 从第1步到第5步,我认为我输入正确是正确的。
我实际上不太了解第6步。
我的问题是如果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方法,而不是在Math类中使用sqrt方法:
对于大于1的数字,平方根方法必须首先将下限设置为1和数字的上限(因为数字的平方根始终位于1和数字之间)。
然后必须确定下限和上限之间的中点并评估中点的平方。 如果中点的平方大于数字,则平方根方法必须将上限移动到中点,类似地,如果中点的平方小于数字,则必须将下限移动到中点。
移动适当的限制后,平方根方法必须评估新的中点并重复该过程,直到获得所需的精度。
双精度浮点数所需的精度为8位有效数字。 任何迭代的精度可以通过将限制之间的差除以下限来确定。
当这小于1/108时,限制之间的任何数字都将是对所需精度的数字的平方根的估计。 为了最小化误差,平方根方法应返回满足精度要求的最终限制之间的中点。
平方根方法必须返回零和一的特殊情况的精确值。
如果应用程序尝试计算负数的平方根,则平方根方法应显示相应的消息并终止该程序。
任何帮助表示赞赏!
如果使用更高位数打印upperLimit/lowerLimit
,您将看到它小到1.0000000000000002
,但永远不会达到1,这就是您的循环永远不会结束的原因。
只要:不要停留在循环中:
upperLimit/lowerLimit != 1
你应该把条件改为:
while (upperLimit - lowerLimit > 0.0000000001)
当限制彼此足够接近时,它将退出循环。
这就是步骤#6的意思是“8位有效数字” - 你的近似应该得到前8位有效数字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.