sqrt()函数,是绝大部分语言支持的常用函数,它实现的是开方运算;开方运算最早是在我国魏晋时数学家刘徽所著的《九章算术》被提及。今天写了几个函数加上国外大神的几个神级程序带大家领略sqrt的神奇之处。
1、古人算法(暴力法)
原理:从0开始0.00001,000002...一个一个试,直到找到x的平方根,代码如下:
1、整数开平方步骤: (1)将被开方数从右向左每隔2位用撇号分开; (2)从左边第一段求得算数平方根的第一位数字; (3)从第一段减去这个第一位数字的平方,再把被开方数的第二段写下来,作为第一个余数; (4。
public class APIsqrt { static double baoliSqrt(double x) { final double _JINGDU = 1e-6; double i; for (i = 0; Math.abs(x - i * i) > _JINGDU; i += _JINGDU) ; return i; } public static void main(String[] args) { double x = 3; double root = baoliSqrt(x); System.out.println(root); }
测试结果:
2、牛顿迭代法
计算机科班出身的童鞋可能首先会想到的是《数值分析》中的牛顿迭代法求平方根。原理是:随意选一个数比如说8,要求根号3,我们可以这么算:
(8 + 3/8) = 4.1875
(4.1875 + 3/4.1875) = 2.4519
(2.4519 + 3/2.4519) = 1.837
(1.837 + 3/1.837) = 1.735
做了4步基本算出了近似值了,这种迭代的方式就是传说中的牛顿迭代法了,代码如下:
1、将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开(竖式中的11’56),分成几段,表示所求平方根是几位数;2、根据左边第一段里的数,求得平方根的最高位上的数(竖式中的3);3、从第一段的。
测试结果:
3、暴力-牛顿综合法
原理:还是以根号3为例,先用暴力法讲根号3逼近到1.7,然后再利用上述的牛顿迭代法。虽然没有用牛顿迭代好,但是也为我们提供一种思路。代码如下:
测试结果:
4、二分开方法
原理:还是以3举例:(0+3)/2 = 1.5,1.5^2 = 2.25,2.25 < 3;
可以手动开平方。手开平方就是一种笔算出一个数的平方根。一般来说能够开方开的尽的,用上述方法算一两次基本结果就出来了。例:计算469225的平方根。首先发现600^2<469225<700^2,可挑选650作为第一次计算的数。0.5*。
(1.5+3)/2 = 2.25,2.25^2 = 5.0625,5.0625 > 3;
直到前后两次平均值只差小于自定义精度为止,代码如下:
public class APIsqrt { static double erfenSqrt(double x) { if (x < 0) { System.out.println(&34;); return -1; } if (x == 0) return 0; final double _JINGDU = 1e-6; double _low = 0; double _high = x; double _mid = Double.MAX_VALUE; double last_mid = Double.MIN_VALUE; while (Math.abs(_mid - last_mid) > _JINGDU) { last_mid = _mid; _mid = (_low + _high) / 2; if (_mid * _mid > x) _high = _mid; if (_mid * _mid < x) _low = _mid; } return _mid; } public static void main(String[] args) { double x = 3; double root = erfenSqrt(x); System.out.println(root); }}
测试结果:
开平方的方法如下:第一步,把被开平方数的整数部分,从个位数起向左,每隔两位数划为一段,分开几段,代表所求的平方根是几根数。第二步,按照左边第一段里面的数字,求得平方根最高位上的数。第三步,从第一段的。
5、计算 (int)(sqrt(x))算法
PS:此算法非博主所写
原理:空间换时间,细节请大家自行探究,代码如下:
测试结果:8
6、最快的sqrt算法
PS:此算法非博主所写
第一步:将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开,分成几段,表示所求平方根是几位数;第二步:根据左边第一段里的数,求得平方根的最高位上的数;第三步:从第一段的数减去最高位上数的。
这个算法很有名,大家可能也见过,作者是开发游戏的,图形算法中经常用到sqrt,作者才写了一个神级算法,和他那神秘的0x5f3759df,代码如下
34;%lf",1/InvSqrt(3)); return 0;}
测试结果:
7、一个与算法6相似的算法
述求平方根的方法,称为笔算开平方法,用这个方法可以求出任何正数的算术平方根,它的计算步骤如下:1.将被开方数的整数部分从个位起向左每隔两位划为一段,用撇号分开(竖式中的11'56),分成几段,表示所求平方根是几。
PS:此算法非博主所写
代码如下:
34;%f",SquareRootFloat(3)); return 0;}
测试结果: