求数值的n次方根
二分法
float SqrtByBisection(float n) //用二分法
{
    if(n<0) //小于0的按照你需要的处理
        return n;
    float mid,last;
    float low,up;
    low=0,up=n;
    mid=(low+up)/2;
    do
    {
        if(mid*mid>n)
            up=mid;
        else
            low=mid;
        last=mid;
        mid=(up+low)/2;
    }while(abs(mid-last) > eps);//精度控制
    return mid;
}
二分法和系统函数性能差距几百倍。
牛顿迭代法
要求\(t^\frac {1} {n}\),设所求值为\(x\),可列方程\(x^n - t = 0\),令\(f(x) = x^n - t = 0\),现使用泰勒公式在一个初始的点\(x_0\)处展开\(f(x)\),有
x = x_0 - \frac {f(x_0)} {f'(x_0)}
$$,
这样计算出的$x$必然存在误差(除非你$x_0$初始值给定的就直接是精确结果,这个概率很小),那我们将计算出的$x$再作为第二次迭代的初始值$x_1$带入上式中,得到$x_2$,以此类推,即有:
\]
x_1 = x_0 - \frac {f(x_0)} {f'(x_0)},
x_2 = x_1 - \frac {f(x_1)} {f'(x_1)},
x_3 = x_2 - \frac {f(x_2)} {f'(x_2)},
...
x_{n+1} = x_n - \frac {f(x_n)} {f'(x_n)}
> 已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
因此,这样的过程是收敛的。
回到上面的式子,由$x_{n+1} = x_n - \frac {f(x_n)} {f'(x_n)}$,当求平方根的时候,该递推式变为$x_{n+1} = x_n - \frac {x^2_n - t} {2*x_n}$,化简,有$x_{n+1} = \frac {1} {2} * (x_n + \frac {t} {2*x_n})$,因此,写代码时就可以根据该式进行迭代求解。
例:
求根号2的值,假设初值$x_0 = 4$,
```
( 4 + 2/4 ) / 2 = 2.25
( 2.25 + 2/2.25 ) / 2 = 1.56944..
( 1.56944..+ 2/1.56944..) / 2 = 1.42189..
( 1.42189..+ 2/1.42189..) / 2 = 1.41423..
….
```
代码如下:
```cpp
float SqrtByNewton(float x)
{
    float val = x;//最终
    float last;//保存上一个计算的值
    do
    {
        last = val;
        val =(val + x/val) / 2;
    }while(abs(val-last) > eps);
    return val;
}
```\]
求数值的n次方根的更多相关文章
- MATLAB中的微积分运算(数值&符号)
		显然这个函数是单词differential(微分)的简写,用于计算微分.实际上准确来说计算的是差商. 如果输入一个长度为n的一维向量,则该函数将会返回长度为n-1的向量,向量的值是原向量相邻元素的差, ... 
- 【Offer】[16] 【数值的整数次方】
		题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数 ... 
- c语言求回文数的三种算法的描述
		c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ... 
- php数字操作,高精度函数,保留计算结果小数位
		$l = 45456.51; $r = 455778.44; $e = '100.00'; $f= '500.00'; $res = bcadd($l, $r,3);//小数点后的位数,精度就是由这个 ... 
- Java开发笔记(二十六)方法的输出参数
		前面介绍了方法的输入参数,与输入参数相对应的则为输出参数,输出参数也被称作方法的返回值,意思是经过方法的处理最终得到的运算数值.这个返回值可能是整型数,也可能是双精度数,也可能是数组等其它类型,甚至允 ... 
- python内置函数详细介绍
		知识内容: 1.python内置函数简介 2.python内置函数详细介绍 一.python内置函数简介 python中有很多内置函数,实现了一些基本功能,内置函数的官方介绍文档: https: ... 
- 瘋子C++笔记
		瘋耔C++笔记 欢迎关注瘋耔新浪微博:http://weibo.com/cpjphone 参考:C++程序设计(谭浩强) 参考:http://c.biancheng.net/cpp/biancheng ... 
- 用一条sql语句显示数据百分比并加百分号
		来源于:http://neil-han.iteye.com/blog/1948124 求数值所占比重 关键点:(round(t1.cnt/t2.totalCount*100,2))||'%' 
- 【GoLang】转载:我为什么放弃Go语言,哈哈
		我为什么放弃Go语言 作者:庄晓立(Liigo) 日期:2014年3月 原创链接:http://blog.csdn.NET/liigo/article/details/23699459 转载请注明出处 ... 
随机推荐
- python - threading.local
			import time import threading try: # 线程和协程都可处理 import greenlet get_ident = greenlet.getcurrent except ... 
- redis 介绍与操作
			参考连接: https://www.cnblogs.com/wupeiqi/articles/5132791.html redis 是什么? redis是一个软件,帮助开发者对一台机器的内存进行操作 ... 
- 什么是 restful 规范?
			一种软件架构风格.设计风格,而不是标准,只是提供了一组设计原则和约束条件. 一.协议 API与用户的通信协议,总是使用HTTPs协议. 什么是https协议 二.域名 应该尽量将API部署在专用域名之 ... 
- CSP模拟赛 Repulsed(树形DP)
			题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ... 
- 45、[源码]-Spring容器创建-执行BeanFactoryPostProcessor
			45.[源码]-Spring容器创建-执行BeanFactoryPostProcessor 5.invokeBeanFactoryPostProcessors(beanFactory);执行BeanF ... 
- 微信公众号开发--微信JS-SDK分享到朋友圈和分享给朋友
			之前写过一篇使用微信JS-SDK来实现扫一扫功能的博客 微信公众号开发–微信JS-SDK扫一扫功能 在该博客里介绍了微信JS-SDK的基本用法,其中包括以下几个步骤 还详细介绍了通过config接口注 ... 
- sping boot 笔记
			参考 http://blog.csdn.net/catoop/article/details/50501664# 一.简介 Spring 官方网站本身使用Spring 框架开发,随着功能以及业务逻辑 ... 
- How To Use The Repository Pattern In Laravel
			The Repository Pattern in Laravel is a very useful pattern with a couple of great uses. The first us ... 
- learning scala view collection
			The view method will create a non-strict version of the collection which means that the elements of ... 
- hdu 6183
			给出二维平面$opt1.$ 对点 $(x, y)$ 增减颜色 $c$,$opt2.$ 询问矩形 $(1, y_1), (x, y_2)$ 内出现过的颜色种数$x, y <= 1e6, c < ... 
