zoukankan      html  css  js  c++  java
  • 求x得平方根得两种方法

    一个经典得题目是求平方根(见leetcode第69题)

    题目如下,对于某个浮点数x,求其平方根。

    方法一:二分法:

    这种是最简单的,就是定义一个最小值0和最大值number,把一个数取一个中间值(0+number)/2,然后平方,如果平方大于该数值,就把中间值赋给最大值,否者就把中间值赋给最小值,一直循环,直到取到想要的精度为止。

    //二分法 
    double sqrt1(double x){
        double EPSINON = 0.00001;
        double low = 0.0;
        double high = x;
        double mid = (low + high) / 2;
        while ((high - low) > EPSINON){
            if (mid*mid > x){
                high = mid;
            }
            else{
                low = mid;
            }
            mid = (high + low) / 2;
        }
        return mid;
    }

    方法二:牛顿法

    这个也是有迹可循的,求平方根即x^2=n。
    令f(x)=x^2-n
    如图所示:
    取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
    同理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
    以此类推。
    以这样的方式得到的xi会无限趋近于f(x)=0的解。

    判断xi是否是f(x)=0的解有两种方法:
    一是直接计算f(xi)的值判断是否为0,
    二是判断前后两个解xi和xi-1是否无限接近。

    先采用第一种方法判断
    (f(x)-f(xi))/(x-xi)=f’(x),f’(x)是斜率也是f(x)的导函数,即f’(x)=2x。
    化简得:f(xi)=f(x)-f’(x)(x-xi),令f(xi)=0得:
    (x^2-n)-2x(x-xi)=0
    持续化简得:
    xx-n-2xx+2xxi=0
    2xxi=xx+n
    2xi=x+n/x
    xi=(x+n/x)/2
    这样就得到了一元等式,就可

    //牛顿迭代法 
    double sqrt2(double x) {
        if (x == 0) return 0;
        double last = 0.0;
        double res = 1.0;
        while (res != last)
        {
            last = res;
            res = (res + x / res) / 2;
        }
        return res;
    }

    以进行编程了。

  • 相关阅读:
    我希望在软件开发生涯初期就知道的 4 件事
    Git学习-安装与创建本地仓库
    sql 单表distinct/多表group by查询去除重复记录
    <xsl:apply-templates>和<xsl:call-template>的区别
    jquery插件之poshytip
    SQL查询出距当前时间最近的一条或多条记录。
    div标签嵌套原则详解(转载)
    在JSP页面用EL表达式获取数据
    JSP静态include和动态include的区别
    Java基础笔试题
  • 原文地址:https://www.cnblogs.com/shaonianpi/p/12828008.html
Copyright © 2011-2022 走看看