版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/7220506.html 

  作者:窗户

  QQ:6679072

  E-mail:6679072@qq.com

  一个函数从数学上来说可以有无数个函数列收敛于这个函数,那么程序逼近实现来说可以有无数种算法,平方根自然也不例外。

  不知道有多少人还记得手算平方根,那是满足每次在结果上添加一位,也就是按位逼近运算结果的唯一算法。至于数学上如何证明这个唯一性我就不说了,数学证明不会有那么多人有兴趣。按位逼近更加适合手算,举个大家更熟悉的例子,那就是手算除法。我这里就采用按位逼近的手算方法。

  要说手算平方根,原理其实非常简单,

  一是平方根函数是严格单调增函数,

  二就是以下这个恒等式满足

  (a*N+b)≡ (a*N)+ 2*a*b*N + b2

      ≡ (a*N)+ 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)+ 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)+ 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)+ 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语言实现(二) —— 手算平方根的原理的更多相关文章

  1. 平方根的C语言实现(一)

    曾经做一个硬件成本极度控制的项目,因为硬件成本极低,并且还需要实现较高的精度测量,过程中也自己用C语言实现了正弦.余弦.反正切.平方根等函数. 以下,无论是在我的实际项目中还是本地的计算机系统,int ...

  2. 平方根的C语言实现(三) ——最终程序实现

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7223254.html 作者:窗户 Q ...

  3. 平方根的C语言实现(一) —— 浮点数的存储

    版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7203254.html 作者:窗户 Q ...

  4. 手算平方根和基于 Java BigInteger 的大整数平方根的实现

    为了实现任意大数的运算,long用BigInteger替换带哦. 好了废话少数,先说数学原理,也就是手算平方根计算机代码实现!那么什么叫手算平方根了??? 手开方图解 据说前苏联的普通工人都会的(毛熊 ...

  5. 使用C语言实现二维,三维绘图算法(1)-透视投影

    使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...

  6. 使用C语言实现二维,三维绘图算法(3)-简单的二维分形

    使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  7. 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示

    使用C语言实现二维,三维绘图算法(2)-解析曲面的显示 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...

  8. Swift语言指南(二)--语言基础之注释和分号

    原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时会忽略注释. Swift的注释与C语言极其相似,单 ...

  9. #r语言(二)笔记

    #r语言(二)笔记 #早复习 #概述:R是用于统计分析.绘图的语言和操作环境 #对象: #数据类型--统称为对象 #向量(vector):用于存储数值型.字符型或逻辑型数据的一维数组. #定义向量: ...

随机推荐

  1. 把项目中的那些恶心的无处存储的大块数据都丢到FastDFS之快速搭建

        在我们开发项目的时候,经常会遇到大块数据的问题(2M-100M),比如说保存报表中1w个人的ID号,他就像一个肿瘤一样,存储在服务器哪里都 觉得恶心,放在redis,mongodb中吧,一下子 ...

  2. buttongroup中content一次性加载的解决方法

    buttongroup一次性加载所有内容的解决方法 如下图所示: 第一步: 设置windowcontainer的autoLoad属性为false(默认情况下autoLoad属性为true,所以会加载所 ...

  3. HTTPS原理浅析

    HTTPS(Hypertext Transfer Protocol Secure)协议用于提供安全的超文本传输服务. 其本质上是SSL/TLS层上的HTTP协议, 即所谓的"HTTP ove ...

  4. linux上mysql安装与卸载

    以下步骤运行环境是centos6.5   1.查找以前是否装有mysql命令:rpm -qa|grep -i mysql2.删除mysql删除命令:rpm -e --nodeps 包名3.删除老版本m ...

  5. HDU2191--多重背包(二进制分解+01背包)

    悼念512汶川大地震遇难同胞--珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  6. C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

    C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式. 目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形 ...

  7. ORACLE SQL 整理

    1.查询字段中含有小写字母的数据 SELECT MATERIALCODE FROM RFXITEMATTENDCODE WHERE REGEXP_LIKE(MATERIALCODE,'([a-z])' ...

  8. Android数据绑定技术一,企业级开发

    PS:数据绑定,顾名思义是数据与一些控件或者用户账号等绑定,这样用的好处是便于管理.代码清晰,量少. 首先要了解什么是数据绑定? 为什么要用数据绑定? 怎么用数据绑定? 语法的使用 简单例子,数据绑定 ...

  9. day1-Python入门

    百度云有关文档资料链接 链接:https://pan.baidu.com/s/1pLighnX 密码:j69s

  10. 简单用数组模拟顺序栈(c++版)适合新手

    **栈是一种操作受限制的线性表,太多官方的话我也不说了,我们都知道栈元素是先进后出的,它有两种存储结构,分别是顺序存储结构和链式存储结构. **今天我先记一下顺序存储结构,后面我会加上链式存储结构的. ...