4

コードを実行すると時々動作しますが、他の私はこのエラーが発生します:

Exception in thread "main" java.lang.StackOverflowError       
at squareroot.SquareRoot.GetSquareRoot (SquareRoot.java: 9)   
at squareroot.SquareRoot.GetSquareRoot (SquareRoot.java: 13)   
at squareroot.SquareRoot.GetSquareRoot (SquareRoot.java: 13)`

私は自分のコードをチェックしていましたが、無限ループには入っていません。どうすればこの問題を解決できますか?, ありがとう.

public static double GetSquareRoot(double n, double low, double high) {
    double sqrt = (low + high) / 2;
    if (sqrt*sqrt > n)
        return GetSquareRoot(n, low, sqrt);
    if (sqrt*sqrt < n)
        return GetSquareRoot(n, sqrt, high);
    return sqrt;
}
public static double Sqrt(double n){
    return GetSquareRoot(n, 0, n);
}

public static double GetCubicRoot(double n, double low, double high) {
    double cbrt = (low + high) / 2;
    if (cbrt*cbrt*cbrt > n)
        return GetCubicRoot(n, low, cbrt);
    if (cbrt*cbrt*cbrt < n)
        return GetCubicRoot(n, cbrt, high);
    return cbrt;
}
public static double Cbrt(double n) {
    return GetCubicRoot(n, 0, n);
}

public static void main(String[] args) {
    Scanner Input = new Scanner(System.in);

    double n = Input.nextDouble();
    double sqrt = Sqrt(n);
    double cbrt = Cbrt(n);

    System.out.println("Raiz cuadrada igual a: "+ sqrt);        
    System.out.println("Raiz cubica igual a: "+ cbrt);  

}
4

3 に答える 3

10

数値を乗算しても正確な数値が生成される可能性は低いため、結果が最終条件に達する可能性は低いです。平方根は通常正確ではなく、浮動小数点の制限により浮動小数点演算は近似値を使用するため、誤差の範囲を導入する必要があります。

public static double GetSquareRoot(double n, double low, double high) {
    double errorMargin = 0.001;        
    double sqrt = (low + high) / 2;
    double diff = sqrt*sqrt - n;
    if ( diff > errorMargin)
        return GetSquareRoot(n, low, sqrt);
    if ( -diff > errorMargin)
        return GetSquareRoot(n, sqrt, high);
    return sqrt;
}
于 2013-02-28T22:56:16.977 に答える
6

停止条件は「if n == num」ですが、n と num は double です。Double または Float の数値は不正確であることがわかっているため、この条件が満たされない場合があります。代わりにこれを使用してください

if(Math.abs(sqrt*sqrt - n) < .001)
     return sqrt;

これは、2 つの数値の差が「十分に小さくなる」と停止します。

于 2013-02-28T22:55:44.150 に答える
5

double を使用している場合は、デルタ double 値を使用する必要があります。計算された値が期待どおりに等しくない可能性があるためです。

bool CompareDoubles2 (double A, double B) 
{
   diff = A - B;
   return (diff < EPSILON) && (-diff > EPSILON);
}
于 2013-02-28T22:56:27.867 に答える