试图创建二进制搜索平方根计算器,每次接收0作为结果

时间:2015-10-29 21:20:25

标签: java search binary square-root

我是Java的新手,也是我目前的第一堂课。我的任务是创建一个二进制搜索平方根计算器。我相信我的方法和语法大多是正确的,但由于某些原因,无论我在程序中输入什么数字,我都会收到0。谁能告诉我计算方法出了什么问题?

public static double calculation(double userInput, double lowerBound, double upperBound, double midPoint) {
  // Workaround method to calculate the square root of a double integer value, with the use of two bounds getting infintely closer to a fixed point (the square root).
  midPoint = (lowerBound + upperBound) / 2;
  upperBound = userInput;
  while(midPoint*midPoint - userInput > 0.001 || midPoint*midPoint - userInput < -0.001)
  {
    if (midPoint*midPoint > userInput)
    {
      lowerBound = midPoint;
    }
    else if (midPoint*midPoint < userInput)
    {
      upperBound = midPoint;
    }
  }
  midPoint = (lowerBound + upperBound) / 2;
  return midPoint;
}

这是我对本网站的第一篇真实帖子,如果我的格式不正确,我道歉。任何帮助将不胜感激。如果需要,我可以提供更多代码行,但我假设解决方案应该只适用于本节。谢谢!

2 个答案:

答案 0 :(得分:0)

当执行进入while循环时,它永远不会退出,因为midPoint永远不会在循环体内发生变化,因此循环条件将永远为真。我想你想把这一行添加为循环中的最后一个语句:

midPoint = (lowerBound + upperBound) / 2;

另一个错误是循环条件没有意义。 我认为midPoint不应该在(-0.001, 0.001)的范围内。我想你的意思是:

while(midPoint*midPoint - userInput > 0.001 || midPoint*midPoint - userInput < -0.001)

通过这两项更改,您的程序应该终止并按预期工作。

答案 1 :(得分:0)

  1. 没有理由将中点作为参数传递给它进行计算。删除它并让midPoint成为局部变量。

  2. 您将midPoint平方与0.001-0.001进行比较,而不是将这些常量用作userInput的调整。这将导致答案为0。试试这个:

  3. while(midPoint*midPoint > userInput + 0.001 || midPoint*midPoint < userInput - 0.001)
    
    1. 您对下限和上限的调整是向后的。试试这个:
    2.     if (midPoint*midPoint > userInput)
          {
              lowerBound = midPoint;
          }
          else if (midPoint*midPoint < userInput)
          {
              upperBound = midPoint;
          }
      
      1. 调整下限或上限后,您必须计算新的midPoint
      2.     midPoint = (lowerBound + upperBound) / 2;
        }