求一个整数的N次方根 求一个整数的N次方根,N从2到无穷如果用JAVA函数计算的话小数部分最多保留7位而我需要保留10位小数,有没有高手能写这个算法,大家都来看看 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用 Math.pow() 方法不就可以了?这个方法精度很高的啊,采用本地方法实现的,而且速度也很快。你的意思是否是不采用该方法进行计算? 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;} 我的机器是 1.5 的,但是 1.4 的也可以跑的需要导入import java.math.BigDecimal;import java.math.MathContext;这两个类就可以了。另外,你需要把两个中文全身空替换成一个Tab。 double epsilon = 4.5e-16;建议改成 double epsilon = 1e-11; 或更大些,否则很容易造成死循环。 我的是1.4貌似没有java.math.MathContext 这个类不过还是谢谢。 java activation 是干什么的? 关于封装类如Integer的问题 新手的问题————一个异常错误 一个非常棘手的问题,望大虾来帮忙!有关session的问题 Vector类里面的元素是无限制增加吗?? 如何利用ESC键,退出对话框 JAVA 1-100的素数输出求解啊。 请问,如何向actionPerformed中传入参数? 请问这段程序为什么错了? java 中的yield()方法为什么有时候不会让出cpu? 请问jdk+tomcat+sqlserver2000配置jsp环境??? 读TXT内容的问题!
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;
}
import java.math.MathContext;这两个类就可以了。另外,你需要把两个中文全身空替换成一个Tab。