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

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,我认为我做得正

我差一点就要完成我的实际问题了,只是停留在不知道为什么在得到正确的结果后我不能退出循环

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

  • Let
    num
    是应用sqrt方法的数字
  • 对于
    num>1
    lowerLimit=1
    upperLimit=number
  • 然后找到
    下限
    上限
    中点
    ,即
    (下限+上限)/2
  • 求出
    中点的平方
    平方中点=Math.pow(中点,2)
  • 如果
    squareMidpoint>num
    上限=中点
    ,否则
    下限=中点
  • 再次重复第三步,直到获得带有8个有效数字的num
  • 从步骤1到步骤5,我认为我做得正确,因为输出是正确的。

    我实际上不太理解第六步

    我的问题是如果
    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相差不多个数量级,否则您需要引入一些相对的容忍度。