zoukankan      html  css  js  c++  java
  • 计算机如何实现开根号?

    今天看到一个问题:计算机如何实现开根号?


    如何求一个数字的算术平方根(又叫开根号,或者开方)?
    大家普遍都是用计算器直接计算的,对于程序员来说,就是调用sqrt()方法。但是其内部又是怎么实现的呢?下面作了下总结。



    方法一:迭代法

    学过计算方法的应该都还有印象:一个函数 f(x) 在区间 [a,b] 上连续,且 f(x)=0 在 x∈[a,b] 上有解,求x?
    最简单的就是用二分法:分别求f(a)、f(b)、f[(a+b)/2],哪两个乘积为负数则把那两个区间当做 [a,b] ,然后一直循环,直到 a-b 达到要求的精度为止。
    再有一种就是用迭代法:迭代法有很多种,公共的思想是选一个数值,然后不断循环迭代,让它逐渐逼近真实解。至于怎么迭代可以让它趋近真实解,不同问题的求解用的迭代方法不同,我们暂且先忽略。
    其实二分法也算是迭代法的一种了。

    好了,直接看开根号的迭代法代码吧:

    double _sqrt(double a)
    {
        double x1 = a;
        double x2 = a/2;
        while(fabs(x1-x2) > 0.00000001)
        {
            x1 = x2;
            x2 = (x1+a/x1)/2;     ///////迭代的核心代码
        }
        return x1;
    }


    方法二:数学推导

    用计算机设计算法解决问题时,特别是数学问题,最直观的思路有两个。
    一个是利用计算机强大的计算能力,用穷举、递归、迭代等方法,直接求解,或者不断趋近、收敛于真实解。例如有些密码的破解,例如线性方程组的求解等等。
    另外一种就是利用数学,把问题用数学推导简化成一条公式,再通过计算机求解这条公式即可。最典型的就是圆周率Pi的计算公式:π/4=1-1/3+1/5-1/7+1/9-1/11+……

    百度里面有一个求开方的很好的方法,原址见此
    这里写图片描述
    以上方法可以笔算求解出任意一个正数的算术平方根。可是为什么要乘以20呢?为什么a要这样试验得到呢?这些数学原理我们不用深究,毕竟我们的目的不是搞数学研究。
    我们的重点是,这应该怎样转化成程序代码呢?我的大约思路是:
    1、用要求开方的这个数用字符数组存储,然后把它分隔成两个两个字符,用atoi函数转成int型存在一个整型数组里边,然后对这个整型数组进行操作。这样就能求任意长的数字的开方了,这是用第一种方法做不到的。
    2、看上面的图,暂且把193.9叫做商,把29、383、3869叫做除数。则:把商的每一位数存在int型数组里边,则各个除数都能用商的各位数表示出来了。
    3、逻辑实现:重点有两个,一个是除法的实现,另外一个是小数的处理。
    具体的代码就不放出来了。



    以上两种解法,只是解决了开根号的问题而已。我们注重的是求解思路,而不是具体的方法。毕竟生活中的问题不少,而解法又各式不同。但知道了从哪个方向去利用计算机开根号,那开立方、求对数 这些问题也就都容易解了。

    生命不息,学习不止,以后如果还遇到其他解法,再来补上。

  • 相关阅读:
    201506022038_《JavaScript权威指南》(p48-58)
    201506022038_《JavaScript权威指南-判断两个数组相等》(p38-48)
    201506021641_《JavaScript权威指南》(p25-38)
    Linux平台上转换文件编码
    一台服务器上部署多个Terracotta的方法
    Subversion Backup and Restore
    How to name a slf4j logger
    基于ScheduledExecutorService的并发定时任务处理能力测试
    CodeReview of JDK Source Code
    Share Keyboard, Mouse and Clipboard between Multiple Computers
  • 原文地址:https://www.cnblogs.com/Bone-ACE/p/4531297.html
Copyright © 2011-2022 走看看