Math.sqrt函数

1 篇文章 0 订阅

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=xnf(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)=x2C(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)10.4843750.0129892949826980.0000084142302253.539391002504999E12f(xn)84.254.4779411764705884.4721397179561484.472135955001162
  • 最后一次计算就是Math.sqrt(5)函数计算的结果值.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值