我試圖找到一種方式來獲得一個開方沒有內置插件,來到了第i個本,不幸的是它不會工作,我不知道爲什麼爲什麼我無法使用這段代碼找到sqrt?
double num=0;
while ((num*num)!=this.first)
num=num+0.0001;
return num;
我試圖找到一種方式來獲得一個開方沒有內置插件,來到了第i個本,不幸的是它不會工作,我不知道爲什麼爲什麼我無法使用這段代碼找到sqrt?
double num=0;
while ((num*num)!=this.first)
num=num+0.0001;
return num;
從谷歌受騙:
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);
}
}
}
如果您需要在沒有遞歸的解決方案(但while循環,也OK,以下的作品):
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
使用遞歸來解決這個問題是一個糟糕的主意,考慮到max double大約是1.7 * 10^308。 – Jamie
僅限於使用足夠大的數字。我假設(因爲內置的數學庫不允許),這是一個學校作業。你不會用整數範圍以外的值來測試它(再次,假設)。不過,我同意一般遞歸會是一個壞主意,而不是在這種特殊情況下。 –
@Jamie我編輯了我的答案,以消除遞歸。 –
我試着用9運行它,沒有得到輸出,爲什麼沒有num成爲3並輸出它? –
你能提供完整的方法/課程嗎? – dcsohl
由於十進制浮點數如何編碼爲二進制,它可能無法正常工作。它就像這樣經常有問題。使用'='比較它們不是100%保證。相反,你需要比較差異。像while(abs(this.first - (num * num))> 0.0001){...}。另外,我希望這是第一遍,你會想出一個更好的算法。如果你想拿出1,000,000 sqrt,這個將永遠佔用。 – Jamie