一个算法题
要求用二分查找实现
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 相乘,在一定精度情况下居然能够得到一个整数, 当然我理解其中的原理,由于二进制长度限制,有限的位置不可能表示无限精度的小数,所以其乘法运算可能会出现溢出的情况,然后乘法运算溢出后的结果刚刚是一个整数。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.