Используйте это:
public class FindSqrt {
public static void main(String[] strings) {
double num = 3;
System.out.println(sqrt(num, 0, num));
}
private static double sqrt(double num, double min, double max) {
if (max-min<=0.0002) min=max;
double middle = (min + max)/2;
double x = middle * middle;
if ((num>=x&&num-x<=0.02)||(x>=num&&x-num<=0.02)) {
return middle;
} else if (x < num) {
return sqrt(num, middle, max);
} else {
return sqrt(num, min, middle);
}
}
}
Если вам нужно решение без рекурсии (но в то время как петли ОК, следующие работы):
public class FindSqrt {
public static void main(String[] strings) {
double num = 131072;
System.out.println(sqrt(num, 0, num));
}
private static double sqrt(double num, double min, double max) {
boolean done = false;
double answer = 0;
while(!done){
if (max-min<=0.0002) min=max;
double middle = (min + max)/2;
double x = middle * middle;
if ((num>=x&&num-x<=0.02)||(x>=num&&x-num<=0.02)) {
done = true;
answer = middle;
} else if (x < num) {
min = middle;
} else {
max = middle;
}
}
return answer;
}
}
Однако, в любом случае, вы можете использовать это найти квадратный корень из чисел < = 131072
Я пробовал запустить его с 9 и не получил выход, почему не num стало 3 и вывести его? –
Можете ли вы предоставить полный метод/класс? – dcsohl
Вероятно, он не работал должным образом из-за того, как десятичные числа с плавающей запятой закодированы в двоичные файлы. У него часто возникают проблемы, подобные этому. Использование '=' для их сравнения не гарантируется на 100%. Вместо этого вам нужно сравнить разницу. Что-то вроде while (abs (this.first - (num * num))> 0.0001) {...}. Кроме того, я надеюсь, что это первый проход, и вы придумаете лучший алгоритм. Это можно было бы взять навсегда, если бы вы захотели придумать sqrt 1 000 000. – Jamie