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