废话不多说,直接上代码
public class Main { public static void main(String[] args) { //开2的平方根 结果:1.414213562373078 double result = sqrt(2,2); System.out.println(result); //开8的立方根 结果:2.0000000000000213 double result2 = sqrt(8,3); System.out.println(result2); //开81的4次方根 结果:2.999999999999993 double result3 = sqrt(81,4); System.out.println(result3); } //精度限制 final static double EPSINON = 0.0000000000001; //主要函数,对value开n次根 static double sqrt(double value,int n){ //算一个低值 ,当前值作为高值 double low = getMin(value,n), high = value; //中间值 double mid = (high + low) / 2; //精度不满足要求一直循环 while (high - low > EPSINON){ double x = getX(mid,0,n); if ( x > value){ high = mid; }else{ low = mid; } mid = (high + low) / 2; } //满足精度,返回 return mid; } /** * 求低值 * @param value * @param n * @return */ static double getMin(double value,int n){ double x = getX(value, -1, n); while (value < x){ value --; x = getX(value, -1, n); } value --; return value; } /** * (value+type) n次方 * @param value * @param type * @param n * @return */ static double getX(double value,int type,int n){ double sourceValue = value; double v = sourceValue + type; for (int i = 1;i < n ; i++){ v *= sourceValue + type; } return v; } }
面试题:不用底层Math.sqrt()函数求sqrt(2),终极二分法开n次根
原文:https://www.cnblogs.com/yangchangkui/p/11218623.html