平方根的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):用于存储数值型.字符型或逻辑型数据的一维数组. #定义向量: ...
随机推荐
- 把项目中的那些恶心的无处存储的大块数据都丢到FastDFS之快速搭建
在我们开发项目的时候,经常会遇到大块数据的问题(2M-100M),比如说保存报表中1w个人的ID号,他就像一个肿瘤一样,存储在服务器哪里都 觉得恶心,放在redis,mongodb中吧,一下子 ...
- buttongroup中content一次性加载的解决方法
buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...
- HTTPS原理浅析
HTTPS(Hypertext Transfer Protocol Secure)协议用于提供安全的超文本传输服务. 其本质上是SSL/TLS层上的HTTP协议, 即所谓的"HTTP ove ...
- linux上mysql安装与卸载
以下步骤运行环境是centos6.5 1.查找以前是否装有mysql命令:rpm -qa|grep -i mysql2.删除mysql删除命令:rpm -e --nodeps 包名3.删除老版本m ...
- HDU2191--多重背包(二进制分解+01背包)
悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.
C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式. 目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形 ...
- ORACLE SQL 整理
1.查询字段中含有小写字母的数据 SELECT MATERIALCODE FROM RFXITEMATTENDCODE WHERE REGEXP_LIKE(MATERIALCODE,'([a-z])' ...
- Android数据绑定技术一,企业级开发
PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...
- day1-Python入门
百度云有关文档资料链接 链接:https://pan.baidu.com/s/1pLighnX 密码:j69s
- 简单用数组模拟顺序栈(c++版)适合新手
**栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构. **今天我先记一下顺序存储结构,后面我会加上链式存储结构的. ...