Java面试题:实现一个sqrt开放函数,指定精度获取结果

面试

一面的时候面试官拿出这道题,一开始是懵的,没有什么思路。
因为平时一般都用Math.sqrt()函数,很少思考自己怎么实现一个开方函数。

思路

正难则反,直接求开方没有思路,我们考虑求平方。
假设我们要计算5的开方的值,可以依照以下的思路:

  1. 从1-5之间选择一个值,假设我们选择中值,计算2.5*2.5 = 6.25 > 5
  2. 那么再从1-2.5中间选择一个值,还是选择中值,计算1.75*1.75 = 3.062<5
  3. 那么再从1.75-2.5中间选择一个值。。。。
    那么很明显,是一个二分法的题目。

精度问题

因为要求指定精度去输出,那么精度是什么含义呢?
百度百科对精度这样定义:反映测量结果与真值接近程度的量,称为精度,它与误差的大小相对应,因此可用误差大小来表示精度的高低,误差小则精度高,误差大则精度低。
因此我们用 结果值*结果值 - 输入值,来刻画精度的大小,当这个值小于精度值时,即可返回结果。

代码实现

思路虽然想明白了,但是写起来并不简单。需要考虑多种情况。
代码如下

package org.example.test;

public class sqrt {
    /**
     * 基于二分法实现指定精度的开方函数
     * @param input 输入参数
     * @param currency
     * @return
     */

    public static double sqrt(double input, double currency){
        //考虑特殊情况,负数因为没有平方根,返回-1
        if(input < 0) return -1;
        //input为1时直接二分会报错
        if(input == 1 || input == 0) return input;
        //定义左右边界初值
        double left = 0;
        double right = 0;
        //input在(0,1),结果应当比input大
        if(input>0 && input < 1){
            left = input;
            right = 1;
        }
        //input在(1,+∞),结果应当比input小
        if(input > 1){
            left = 1;
            right = input;
        }
        //循环进行二分,那么递归结束的条件是什么呢?这就要用到精度了
        //精度指的是计算值和真实值之间的差值
        double middle = (left + right) / 2;
        while(Math.abs(middle*middle - input) >= currency){
            if(middle * middle > input) {
                right = middle;
            }else {
                left = middle;
            }
            middle = (left + right) / 2;
        }
        return middle;
    }

    public static void main(String[] args) {
        //示例
        System.out.println(sqrt(6,1e-5));
    }
}

至此,整个题目完成了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值