求一个整数的N次方根,N从2到无穷如果用JAVA函数计算的话小数部分最多保留7位而我需要保留10位小数,有没有高手能写这个算法,大家都来看看

解决方案 »

  1.   

    使用 Math.pow() 方法不就可以了?这个方法精度很高的啊,采用本地方法实现的,而且速度也很快。你的意思是否是不采用该方法进行计算?
      

  2.   

    public static void main(String[] args) {  System.out.println(Math.pow(2, 1.0 / 2));  System.out.println(root(2, 2));  BigDecimal b = root(new BigDecimal(2), 2);
      System.out.println(b.toString());    
    }
    // 算法来源:http://bbs.51js.com/thread-59522-1-197.html,9楼的回帖
    // 原算法使用 JavaScript 写的,使用 Java 改进了一下
    // 这个算法的收敛速度很快,可以堪称优秀了
    public static double root(double num, int radix) {
      double result = 1.0;
      double pow = result;
      double r = pow / result;
      double error = pow - num;
      double p = r * radix;
      double epsilon = 4.5e-16;
      while (Math.abs(error) > epsilon) {
        result = result - error / p;      
        pow = result;
        int k = 1;
        while (k < radix) {
          pow *= result;
          k++;
        }
        r = pow / result;
        error = pow - num;
        p = r * radix;
      }
      return result;
    }// BigDecimal 的 pow() 方法只能是 int 类型的,这样就不能计算
    // 方根,按上述算法新增一个
    public static BigDecimal root(BigDecimal num, int radix) {
      int precision = 15; // 增大可以提高运算精度
      BigDecimal result = new BigDecimal(1);
      BigDecimal pow = result;
      BigDecimal r = pow.divide(result);
      BigDecimal error = pow.subtract(num);
      BigDecimal p = r.multiply(new BigDecimal(radix));
      BigDecimal epsilon = new BigDecimal(10).pow(-precision, new MathContext(precision));
      while (error.abs().compareTo(epsilon) > 0) {
        result = result.subtract(error.divide(p, new MathContext(precision)));      
        pow = result;
        int k = 1;
        while (k < radix) {
          pow = pow.multiply(result);
          k++;
        }
        r = pow.divide(result);
        error = pow.subtract(num);
        p = r.multiply(new BigDecimal(radix));
      }
      return result;
    }
      

  3.   

    我的机器是 1.5 的,但是 1.4 的也可以跑的需要导入import java.math.BigDecimal;
    import java.math.MathContext;这两个类就可以了。另外,你需要把两个中文全身空替换成一个Tab。
      

  4.   

    double epsilon = 4.5e-16;建议改成 double epsilon = 1e-11; 或更大些,否则很容易造成死循环。
      

  5.   

    我的是1.4貌似没有java.math.MathContext 这个类不过还是谢谢。