繁体   English   中英

使用近似方法实现sqrt方法。 即使条件为假,也无法退出循环

[英]Implement sqrt method using the approximation approach. Cannot exit loop even the condition is false

我是如此接近完成我的实际问题,只是坚持不知道为什么我得到正确的结果后无法退出循环。

问题要求使用近似方法实现sqrt方法。

  1. num是应用sqrt方法的数字。
  2. 对于num> 1lowerLimit = 1lowerLimit = 1 upperLimit = number
  3. 然后找到midpointlowerLimitupperLimit其是(lowerLimit+upperLimit)/2
  4. 平方midpointsquareMidpoint = Math.pow(midpoint, 2)
  5. 如果squareMidpoint > numsquareMidpoint > num upperLimit = midpoint ,则lowerLimit= midpoint
  6. 再次重复第三步,直到获得8位有效数字的num。

从第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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM