2016-12-06 77 views

回答

0

从谷歌受骗:

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精确比较将不匹配。

3

你不会得到确切的平等。你可能会想到真正平方根的0.0001,但就是这样。但num*num不会完全等于this.first,除非它实际上是0.0001的倍数的正方形。

while ((num * num) < this.first)可能会更接近你想要的。

+0

我试着用9运行它,没有得到输出,为什么没有num成为3并输出它? –

+1

你能提供完整的方法/课程吗? – dcsohl

+0

由于十进制浮点数如何编码为二进制,它可能无法正常工作。它就像这样经常有问题。使用'='比较它们不是100%保证。相反,你需要比较差异。像while(abs(this.first - (num * num))> 0.0001){...}。另外,我希望这是第一遍,你会想出一个更好的算法。如果你想拿出1,000,000 sqrt,这个将永远占用。 – Jamie

1

使用此:

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

+0

使用递归来解决这个问题是一个糟糕的主意,考虑到max double大约是1.7 * 10^308。 – Jamie

+1

仅限于使用足够大的数字。我假设(因为内置的数学库不允许),这是一个学校作业。你不会用整数范围以外的值来测试它(再次,假设)。不过,我同意一般递归会是一个坏主意,而不是在这种特殊情况下。 –

+1

@Jamie我编辑了我的答案,以消除递归。 –

相关问题