java实现一定精度的开根号运算

需求:在不借助系统库的情况下,编写一个函数,实现开根号的操作,并且保证一定的精度

代码采用了牛顿迭代法以及二分查找法两种方式并分别打印了他们的循环次数以比较优劣:

/**
 * 实现一个函数,完成对v开根号的操作,误差小于t,不能调用函数库
 */
public class Sqrt{

    /**
     * 可以使用牛顿迭代法
     * 首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了
     */
    public static double iter(int v,double t){
        int i = 0;
        // 首先预估一个数
        double random = v >> 1;
        while(abs((v-random*random)) > t){
            random = (random + v/random) >> 1;
            i++;
        }

        System.out.println("开根号值: "+random+"  ,循环次数: "+i);
        return random;
    }

    // 二分查找法
    public static double binarySearch(int v,double t){
        int i = 0;
        double max = v;
        double min = 0;
        double temp = v >> 1;
        while (abs(temp*temp-v) > t){
            if (temp*temp > v ){
                max = temp;
            } else if(temp*temp < v){
                min = temp;
            }
            temp = (min+max) >> 1;
            i++;
        }

        System.out.println("开根号值: "+temp+"  ,循环次数: "+i);
        return temp;
    }

    public static double abs(double a){
        return (a <= 0.0D) ? 0.0D - a : a ;
    }

    public static void main(String[] args) {
        iter(100,0.1);
        System.out.println("-----------------");
        binarySearch(100,0.1);
    }
}

结果如下:

开根号值: 31.638589750191308  ,循环次数: 7
-----------------
开根号值: 31.63909912109375  ,循环次数: 16

牛顿迭代法相比较二分查找法效率更高

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值