尝试创建一个二进制搜索平方根计算器,每次都收到 0 作为结果

Attempting to create a binary search square root calculator, receiving 0 as a result every time

我对 Java 非常陌生,目前是我的第一个 class。我的任务是创建一个二进制搜索平方根计算器。我相信我的方法和语法大部分都是正确的,尽管出于某种原因,无论我在程序中输入什么数字,结果我都会收到 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;
}

这是我第一次真正 post 到这个网站,如果我的格式有任何不正确的地方,我深表歉意。任何帮助将不胜感激。如果需要,我可以提供更多代码行,但我假设解决方案应该只用这一部分就可以实现。谢谢!

当执行进入while循环时,它永远不会退出,因为midPoint在循环体内永远不会改变,所以循环条件永远为真。我认为您想将此行添加为循环中的最后一条语句:

midPoint = (lowerBound + upperBound) / 2;

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

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

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

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

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

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