
Math.sqrt函数
简要记录一下sqrt函数的计算原理
·
1.函数API约束
/**
* 1. 如果入参是NaN或小于0,则返回NaN;
* 2. 如果是正无穷,则结果是正无穷;
* 3. 如果是±0,结果也为0;
* 4. 其他情况返回最接近平方根的双精度数.
*/
public static double sqrt(double a) {
// 使用这个API的作用是当程序(进程)进入即时编译时直接使用指令进行平方根计算,提高效率
// 例如SSE2浮点指令集中的sqrtsd指令.
return StrictMath.sqrt(a);
}
2.原理
2.1 牛顿迭代法
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xn−f′(xn)f(xn)
2.2 计算思路
取 f ( x ) = x 2 − C ( x > 0 , C 为求根号的值 ) , 则 f ′ ( x ) = 2 x 取f(x)=x^2-C(x>0,C为求根号的值),则f'(x)=2x 取f(x)=x2−C(x>0,C为求根号的值),则f′(x)=2x
- 由牛顿迭代法取到IEEE 754的尾数极限作为开根号的近似值.
例如求根号5的求值如下:
n x n + 1 x n f ( x n ) f ′ ( x n ) 0 17 8 2 − 1 8 1 2.238970588235294 17 8 − 0.484375 4.25 2 2.236069858978074 2.238970588235294 0.012989294982698 4.477941176470588 3 2.236067977500581 2.236069858978074 0.000008414230225 4.472139717956148 4 2.23606797749979 2.236067977500581 3.539391002504999 E − 12 4.472135955001162 \begin{array}{c|lcr} n & x_{n+1} & x_n & f(x_n) & f'(x_n)\\ \hline 0 & \frac{17}{8} & 2 & -1 & 8 \\ 1 & 2.238970588235294 & \frac{17}{8} & -0.484375 & 4.25 \\ 2 & 2.236069858978074 & 2.238970588235294 & 0.012989294982698 & 4.477941176470588 \\ 3 & 2.236067977500581 & 2.236069858978074 & 0.000008414230225 & 4.472139717956148 \\ 4 & 2.23606797749979 & 2.236067977500581 & 3.539391002504999E-12 & 4.472135955001162 \\ \end{array} n01234xn+18172.2389705882352942.2360698589780742.2360679775005812.23606797749979xn28172.2389705882352942.2360698589780742.236067977500581f(xn)−1−0.4843750.0129892949826980.0000084142302253.539391002504999E−12f′(xn)84.254.4779411764705884.4721397179561484.472135955001162 - 最后一次计算就是Math.sqrt(5)函数计算的结果值.
更多推荐
所有评论(0)