这样的面试题是否有意义?

2020-01-19 18:32:02 +08:00
 lewis89

一个算法题

要求用二分查找实现

public double sqrt(int num){
    //实现
}
 /**
     * 二分查找 求平方根
     * @param num
     * @return
     */
    public double sqrt(int num) {
        //这个题应该要看精度 如果没有特殊的精度要求
        double low = 0;
        double high = num;
        while (low < high) {
            double mid = (low + high) / 2;
            if ((mid * mid) > num) {
                high = mid;
            } else if ((mid * mid) < num) {
                low = mid;
            } else {
                // mid * mid == num 因为我做这个题目时候会觉得这个条件可能永远不会成立
                // 但是 double 类型存在一个精度问题
                // 当 mid 的精度到达一定位置时候 mid * mid 会得到一个整数 其刚好是 num 的近似平方根
                return mid;
            }
        }
        return -1;
    }

这个题目 当时是没有精度要求的,我根本就想不到 两个 double 相乘,在一定精度情况下居然能够得到一个整数, 当然我理解其中的原理,由于二进制长度限制,有限的位置不可能表示无限精度的小数,所以其乘法运算可能会出现溢出的情况,然后乘法运算溢出后的结果刚刚是一个整数。

4185 次点击
所在节点    程序员
24 条回复
lewis89
2020-01-20 07:20:35 +08:00
@bitholic #11 如果是 int 型的话 我可能就已经想出来了
ebingtel
2020-01-20 08:43:54 +08:00
double mid = (low + high) / 2;……容易溢出的吧
ineed123
2020-01-20 10:04:26 +08:00
double mid = (high - low) / 2 + low; 或 double mid = low + ((high - low) >> 1); // 防止溢出
Jrue0011
2020-01-20 10:55:39 +08:00
看到楼主这帖子。。我这种大学数学全忘了的在网上搜了下,高数里有个二分法求方程根的近似值,别说还挺像的。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639245

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX