﻿ почему я не могу найти sqrt с помощью этого кода?

почему я не могу найти sqrt с помощью этого кода?

Я попытался найти способ получить sqrt без встроенных модулей и придумал это, к сожалению, это не сработает, и я понятия не имею, почему

double num=0;
while ((num*num)!=this.first)
num=num+0.0001;
return num;

java,sqrt,

-3

Ответов: 3

What is floating point error?
The most common situation is illustrated by the decimal number 0.1.
Although it has a finite decimal representation, in binary it has an
infinite repeating representation. Thus when = 2, the number 0.1 lies
strictly between two floating-point numbers and is exactly representable
by neither of them.

Итак, заполнив ваш пример из 9, ваша петля, вероятно, выглядела так:

num = 0; add 0.0001 -> num is now 0.000099999999
add 0.0001 -> num is now 0.000199999999998
add 0.0001 -> num is now 0.000299999999997
etc...
add 0.0001 -> num is now 2.9999999999953667
add 0.0001 -> num is now 3.000099999994321

Итак, ваше точное сравнение с 3 не будет соответствовать.

Вы не получите точного равенства. Возможно, вы можете попасть в 0.0001истинный квадратный корень, но это все. Но num*numне будет ровно равным, this.firstесли это фактически квадрат кратного 0.0001.

while ((num * num) < this.first) вероятно, будет ближе к тому, что вы хотите.

Использовать это:

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;

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;
} else if (x < num) {
min = middle;
} else {
max = middle;
}
}