时间:2021-05-22
牛顿法求平方根
原理
计算机常用循环来计算F的平方根.从某个猜测的x值开始,根据x^2与F的近似度来调整x,产生一个更好的猜测:
x -= (x * x - F) / (2 * x)
重复调整过程,猜测的结果会越来越精确,得到的答案越发的趋近实际的平方根. 我们可以设定精度,控制计算结果与实际结果的偏差.
实现
package mainimport ( "fmt" "math")func Sqrt(F float64) float64 { x := 1.0 for math.Abs(x * x - F) > 1e-10 { x -= (x * x - F) / (2 * x); } return x}func main() { fmt.Println("牛顿法求平方根:Sqrt(10) = ", Sqrt(10)) fmt.Println("库函数求平方根:Sqrt(10) = ", math.Sqrt(10))}补充知识:X的平方根的golang实现
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
输入: 4
输出: 2
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。
首先遇到这种题目肯定要想到使用内置得api来解答:
//使用api来求解func mySqrt(x int) int { f := float64(x) ff := math.Sqrt(f) return int(ff)}其次我们可以使用牛顿法求平方根:
牛顿法:(以本题为例子)
计算平方根,其实就是计算
x^2 =n
的解
令f(x)=x2-n,相当于求解f(x)=0的解,如上图所示。
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
判断xi是否是f(x)=0的解有两种方法:
一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f'(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。
继续化简
xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2
迭代公式就已经出来了
x = (x + n/x) / 2
那么代码:
//使用牛顿法求平方根func mySqrt1(x int) int { res := x //牛顿法求平方根 for res*res > x { res = (res + x/res) / 2 } return res}以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了javascript基于牛顿迭代法实现求浮点数的平方根。分享给大家供大家参考,具体如下:今天在网上看到一则利用牛顿迭代法求浮点数的平方根的方法,发
求一个数的平方根函数sqrt(intnum),在大多数语言中都提供实现。那么要求一个数的平方根,是怎么实现的呢?实际上求平方根的算法方法主要有两种:二分法(bi
求平方根命令操作系统支持:Windows、Linux所属类别:算术运算返回指定参数的平方根。语法:双精度小数型求平方根(欲求其平方根的数值)例程说明:将数值编辑
C语言中sqrt意思是平方根函数,计算一个非负实数的平方根。在VC6.0中的math.h头文件的函数原型为doublesqrt(doublenumber)。sq
关于C语言中的开方计算,首先想到的当然是sqrt()函数,让我们先来回顾一下它的基本用法:头文件:#includesqrt()用来求给定值的平方根,其原型为:d