平方根的C语言实现(二) —— 手算平方根的原理
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7220506.html 作者:窗户 QQ:6679072 E-mail:6679072@qq.com
一个函数从数学上来说可以有无数个函数列收敛于这个函数,那么程序逼近实现来说可以有无数种算法,平方根自然也不例外。
不知道有多少人还记得手算平方根,那是满足每次在结果上添加一位,也就是按位逼近运算结果的唯一算法。至于数学上如何证明这个唯一性我就不说了,数学证明不会有那么多人有兴趣。按位逼近更加适合手算,举个大家更熟悉的例子,那就是手算除法。我这里就采用按位逼近的手算方法。
要说手算平方根,原理其实非常简单,
一是平方根函数是严格单调增函数,
二就是以下这个恒等式满足
(a*N+b)2 ≡ (a*N)2 + 2*a*b*N + b2
≡ (a*N)2 + b * ((a*N) * 2 + b)
我们实例操作一次平方根笔算,来解释一下。
我们来求5499025的平方根。
先将5499025两位两位从低往高排,为
5 49 90 25
2*2<5<3*3
所以最高位为2,
然后我们再来看549的平方根,
我们假设549的平方根的整数部分是2*10+b,则根据之前的恒等式,N在这里等于10,a在这里等于2,有
549 >=(2*10)2 + b * ((2*10) * 2 + b)
整理一下,149 >= b * (40 + b)
3 * 43 < 149 < 4 * 44
所以b=3,
549的平方根整数部分是23,
再假设54990的平方根整数部分为23*10+b,
则
54990 >= (23*10)2 + b * ((23*10) * 2 + b)
整理一下,2090 >= b * (460 + b),
464 * 4 < 2090 < 465 * 5
所以b=4,
54990的平方根整数部分为234,
最后再来看5499025的平方根的整数部分,假设为234 * 10 + b,
则
5499025 >= (234*10)2 + b * ((234*10) * 2 + b)
整理一下, 23425 >= b * (4680 + b)
而5 * 4685 = 23425, 等式成立,
所以最终我们要求的平方根是2345。当然,小数位其实一样可以用这种方法继续算下去。
手算平方根就是如上这样从高位一步步往地位推的过程,写成式子的形式大致如下:
2 3 4 5
-------------------
| 5 49 90 25
2 | 4
-------------------
| 1 49
43 | 1 29 ——当前算出了2,2*10*2 = 40
-------------------
| 20 90
464 | 18 56 ——当前算出了23,23*10*2 = 460
-------------------
| 2 34 25
4685 | 2 34 25 ——当前算出了234,234*10*2 = 4680
-------------------
0
当然,如何写不重要,知道过程便可以继续我们的这个设计。接下去我们要去利用之前的这个算法,改装一下,来进行二进制的开平方。
二进制的每一位不是1就是0,这样在每次往前推一位的时候就相对简单。
举个例子,我们来算121的平方根,也就是二进制下1111001的平方根。
两位两位从低位往高位排
1 0 1 1
------------------
| 1 11 10 01
1 | 1
------------------
| 11
100 | 0 ——当前上面算出了1,1右移动两位为100
------------------
| 11 10
1001 | 10 01 ——当前上面算出了10,1右移动两位为1000
------------------
| 1 01 01
10101 | 1 01 01 ——当前上面算出了101,1右移动两位为10100
------------------
0
每往右边推1位,下面的除数就是上面当前算出来的二进制的数右移两位再加1或者加0
之后,我们就可以用构建利用此算法的平方根了。
平方根的C语言实现(二) —— 手算平方根的原理的更多相关文章
- 平方根的C语言实现(一)
曾经做一个硬件成本极度控制的项目,因为硬件成本极低,并且还需要实现较高的精度测量,过程中也自己用C语言实现了正弦.余弦.反正切.平方根等函数. 以下,无论是在我的实际项目中还是本地的计算机系统,int ...
- 平方根的C语言实现(三) ——最终程序实现
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7223254.html 作者:窗户 Q ...
- 平方根的C语言实现(一) —— 浮点数的存储
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7203254.html 作者:窗户 Q ...
- 手算平方根和基于 Java BigInteger 的大整数平方根的实现
为了实现任意大数的运算,long用BigInteger替换带哦. 好了废话少数,先说数学原理,也就是手算平方根计算机代码实现!那么什么叫手算平方根了??? 手开方图解 据说前苏联的普通工人都会的(毛熊 ...
- 使用C语言实现二维,三维绘图算法(1)-透视投影
使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
使用C语言实现二维,三维绘图算法(2)-解析曲面的显示 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- Swift语言指南(二)--语言基础之注释和分号
原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时会忽略注释. Swift的注释与C语言极其相似,单 ...
- #r语言(二)笔记
#r语言(二)笔记 #早复习 #概述:R是用于统计分析.绘图的语言和操作环境 #对象: #数据类型--统称为对象 #向量(vector):用于存储数值型.字符型或逻辑型数据的一维数组. #定义向量: ...
随机推荐
- eclipse环境下基于tomcat-7.0.82构建struts2项目
开山第一篇,毕业4个月目前接触最多的框架还是s2sh框架.... 具备完整的开发环境下,在eclipse下启动tomcat出现如下所示画面表示环境构建成功. 第一步:创建web项目,截图如下 此页面只 ...
- C++ 将汉字转换成拼音全拼
#include <string> using std::string; //======================================================= ...
- Intellij IDEA热加载更新 IntelliJ IDEA热加载自动更新(Update classes and resources )
定义及分类 1.1 定义 在web开发环境下,所谓热部署,即在不重新部署webapp的情况下,实时将工程代码改动更新到web容器中(例如tomcat).其原理可以类比ajax的作用,即局部刷新工程资源 ...
- 1005:I Think I Need a Houseboat-poj
1005:I Think I Need a Houseboat 总时间限制: 1000ms 内存限制: 65536kB 描述 Fred Mapper is considering purchasi ...
- CCF认证考试——折点计数
描述:简单题 #include<iostream> using namespace std; int main() { ], n, count = ; cin >> n; ; ...
- java基础回顾(一)
java的特点:开源.安全.跨平台.简单易懂.一次编译可多处运行. JDK:java开发工具包 JDK = JRE+JAVA开发工具 保证能够实现java开发的最小单元 JRE:java运行环境 JR ...
- 【转】千万不要在JS中使用连等赋值操作
原文链接 千万不要在JS中使用连等赋值操作 目录 前言 赋值顺序? 连续赋值能拆开写么? 后记 前言 文章标题这句话原本是在国外某JavaScript规范里看到的,当时并没有引起足够的重视,直到最 ...
- mssql执行计划查看的一些知识
在MSSQL中,查看较慢语句的执行计划,就是一个比较直观的方式, 如果查看执行计划呢: 1.从右到左,从上到下的顺序阅读执行计划2.执行计划中每个图标代表一个运算符,总开销为100%3.数据从右向左在 ...
- 前端UI框架小汇总
前言: 近期,小弟根据GitHub.前端社区.掘金等平台对当前流行的前端UI框架的进行了小小的整理和汇总(ps:前端UI框架的应用是通过GitHub star数,社区热度和使用范围等进行的粗略的汇总[ ...
- PHP核心技术
一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $m ...