有关平方根
有关平方根
基于中算开方的方法
下面是一个完整的例子:
-
将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开,分成几段,表示所求平方根是几位数。例如,要求144的平方根,就把它划分为1 44。 - 根据左边第一段里的数,求得平方根的最高位上的数。这个数应该是满足n^2<=1的最大整数,即n=1。把这个数写在被开方数的右上角,并用它乘以自己,得到1。把这个积写在被开方数的左下角,并用横线划去。
- 从第一段的数减去最高位上数的平方,在它们的差的右边写上第二段数组成第一个余数。例如,1-1=0,再把44写在右边,得到044。
- 把求得的最高位数乘以2去试除第一个余数,所得的最大整数作为试商。例如,1x2=2,用2去试除044,可以得到21。把这个试商写在平方根的右下角,并用它乘以前面得到的2加上试商再乘以试商。例如,21x(2+21)=483。把这个积写在余数下面,并用横线划去。
- 如果余数为0,则说明已经求出了精确的平方根。如果余数不为0,则可以继续添加小数点和0来进行开方。例如,在044下面添加两个0,得到4400。然后重复步骤4和步骤5,直到达到所需的精度或余数为0为止。
因此,144的平方根是12。
常见代码库中用到的方法
- 二分法:利用平方根的单调性,从一个初始区间开始,不断缩小搜索范围,直到找到一个满足精度要求的近似值。例如,这个回答展示了一个用C++实现的二分法求平方根的函数。
- 牛顿法:利用牛顿迭代法,从一个初始值开始,不断用切线逼近平方根曲线,直到找到一个满足精度要求的近似值。例如,这个回答展示了一个用C实现的牛顿法求平方根的函数。
- 快速逆平方根:利用一种巧妙的位操作和牛顿迭代法,快速得到一个数的逆平方根(即平方根的倒数),然后再取倒数得到平方根。这种方法在Quake III游戏中被使用,因为它比标准的浮点运算更快。例如,这个回答展示了一个用C实现的快速逆平方根的函数。
上述方法的优缺点
- 二分法:优点是简单易懂,容易实现,不需要复杂的数学运算。缺点是收敛速度较慢,需要多次迭代才能达到较高的精度。
- 牛顿法:优点是收敛速度较快,每次迭代可以大幅提高精度,对于大多数数值都能有效工作。缺点是需要计算导数和除法,可能涉及复杂的浮点运算,对于一些特殊的数值可能不收敛或收敛到错误的结果。
- 快速逆平方根:优点是非常快速,只需要一次位操作和一次牛顿迭代就能得到一个相当精确的逆平方根,然后再取倒数就得到平方根。缺点是原理不太直观,依赖于特定的浮点格式和魔术常数,可能在不同的平台或编译器上表现不一致或失效。