Math Alg. Root 数学算法笔记:开根号

from 开根号基础公式 - 百度文库

from 开方(数学术语)_百度百科

对于任意实数的开方,可以使用切线法得到其任意精度的结果,切线法的迭代公式为:

取任意初始值

以上迭代序列将会收敛:

实际应用中一般取初始值为稍微大 

的实数,这样可以加快序列的收敛速度。

e.g. (C)

// 2015-12-24
// By: ChenYu
#include "math.h"
#include "stdio.h"
#define ABS(a) ((a)<0?-(a):(a))
#ifdef _WIN32
    typedef unsigned __int64 uint64;
#else
    typedef unsigned long long uint64;
#endif
// calculate a approximate value
static double calcInitRoot(double x, int n)
{
    const uint64 exptMask=((uint64)1<<11)-1;
     const uint64 fracMask=((uint64)1<<52)-1;
    uint64 xInt=*(uint64*)&x;
    int xExpt=(int)((xInt>>52)&exptMask)-1023;
    xInt=((uint64)((xExpt+1024*n-1)/n)<<52)+(xInt&fracMask)/n;
    return *(double*)&xInt;
}
 
double calcRoot(double x, int n)
{
    int i, j, s=1-((x<0)<<(n&1));
    double a=ABS(x);
    double x1, x0=calcInitRoot(a, n);
    double err=x0*1e-14;
    if(x==0)
        return 0;
    for(i=1; i<50; i++)
    {
        double xn=1;
        for(j=0; j<n-1; j++)
            xn*=x0;
        x1=((n-1)*x0*xn+a)/(xn*n);
        // printf("x%d=%.14f\n", i, x1);
        if(ABS(x1-x0)<=err)
            break;
        x0=x1;
    }
    return s*x1;
}
 
void main()
{
    double x=-31141.592653589793;
    int n=11;
    double y=calcRoot(x, n);
    printf("root(%g,%d)=%+.14f\n", x, n, y);
    printf("root(%g,%d)=%+.14f\n", x, n, pow(ABS(x), 1.0/n));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请使用Python 代码来查找文件名为 staticprob.txt中指定字符串'staticprob = '并打印字符串后面8个字符串,以及打印字符串前面最接近字符串的时间,打印信息如下: time = 00:04:29, prob = 0.967633 time = 00:11:14, prob = 0.937645 其中文件名为 staticprob.txt 的文本文件,其中包含以下内容: [00:04:29]A7_TRACE: [ ALG_DBG ] [radar_alg_stru.c:293] ALG_TAG begin(43952[00:04:29]) [00:04:29]A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:9701] sclu[0][x y z p]=[0.62 3.08 0.90 13.82] A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:9701] sclu[1][x y z p]=[3.27 2.57 0.76 12.99] A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:4984] alltrc[0] [report][x y z] = [1][0.79 2.70 1.14 0 41] [0 0 0.000000] A7_TRACE: [ ALG_DBG ] [radar_alg_static.c:2477] max noise=39921.98, indx indy= 1 6 A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:5415] alltrcblk[0] [rep][x y z pre sc on] = [0][0.17 2.91 0.91 0 1 0] A7_TRACE: [ ALG_DBG ] [radar_alg_static.c:1423] Static condition check state1, 0, 0, 0, 5 A7_TRACE: [ ALG_DBG ] [radar_alg_night.c:839] TRC: 0 IS STICA7_TRACE: [ ALG_DBG ] [radar_alg_night.c:261] Frame 21792 bdPos 1.00 A7_TRACE: [ ALG_DBG ] [radar_alg_night.c:577] [night]trc 1 mVzIdx 12 mVz 0.11 maxIdx 0 minIdx 17 maxZ 1.31 minZ 1.25 A7_TRACE: [ ALG_DBG ] [radar_alg_night.c:651] [night]trc 1 bdside 3 bdpos 1 bspos 0 thrVzSitup 0.05 thrZDiffSitup 0.20 A7_TRACE: [ ALG_DBG ] [radar_alg_alm.c:409] Alm Cond: start[cntN][cntA][virW] = [1 0 0 0 0 50] A7_TRACE: [ ALG_DBG ] [radar_alg_alm.c:1041] obj Alm, 0, 0, 0 A7_TRACE: [ ALG_DBG ] [radar_alg_stru.c:409] trc handle[err]=[0][0] [seq,bb,cnt]=[43952 43845 43845] A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:11658] obj[0][zM vzM pre st sp gtup act] = [1.15 0.00 0 0 0 1 5] A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:11699] obj[0] fncId[alg rpt app][x y z] = [0 0 1][0.79 2.70 1.14] score=4 A7_TRACE: [ ALG_DBG ] [radar_alg_stru.c:364] ALG_TAG end(43952) A7_TRACE: [AI_ALG_LOG]: PhaAIPrediction finished. A7_TRACE: [AI_ALG_LOG]: staticprob = 0.967633 [00:11:14]A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:9701] sclu[0][x y z p]=[0.66 2.97 0.88 12.46] A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:5415] alltrcblk[0] [rep][x y z pre sc on] = [0][0.66 3.01 1.08 0 1 0] A7_TRACE: [ ALG_DBG ] [radar_alg_static.c:1423] Static condition check state1, 0, 0, 8, 5 A7_TRACE: [ ALG_DBG ] [radar_alg_path.c:11658] obj[0][zM vzM pre st sp gtup act] = [1.06 0.00 0 0 0 1 5] A7_TRACE: [ ALG_DBG [00:11:14]] [radar_alg_stru.c:293] ALG_TAG begin(48003) [00:11:14]A7_TRACE: [AI_ALG_LOG]: PhaAIPrediction finished. A7_TRACE: [AI_ALG_LOG]: staticprob = 0.937645
05-30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值