k****r 发帖数: 807 | 1 function double sqrt(double d, int p). p is precision option. My code is as
follows. Please let me know if you see any error. Thanks,
public static double sqrt(double d, int p) {
if (d < 0) {
return Double.NaN;
}
double prec = Math.pow(10, - p);
double start = 0;
double end = d;
while (start < end) {
double mid = start + (end - start) / 2;
if (mid == 0) {
return mid;
}
if (mid * mid == d) {
return mid;
} else if (mid < d / mid) {
start = mid + prec;
} else {
end = mid - prec;
}
}
return start;
} |
k****r 发帖数: 807 | |
s**x 发帖数: 7506 | 3 for most of interview codes, if you have more than 10 lines, usually
something wrong.
1) for number less than 1 and great than one, it should be processed
differently.
2) why you need to check mid == 0?
3) why you need add prec to mid each time?
4) always compare with a precision for floats, do not compare directly. |
k****r 发帖数: 807 | 4 大牛能否写个clean的code供学习一下。
【在 s**x 的大作中提到】 : for most of interview codes, if you have more than 10 lines, usually : something wrong. : 1) for number less than 1 and great than one, it should be processed : differently. : 2) why you need to check mid == 0? : 3) why you need add prec to mid each time? : 4) always compare with a precision for floats, do not compare directly.
|
s**x 发帖数: 7506 | 5
google.
【在 k****r 的大作中提到】 : 大牛能否写个clean的code供学习一下。
|
k****r 发帖数: 807 | 6 你太牛了
【在 s**x 的大作中提到】 : : google.
|
D*******a 发帖数: 3688 | 7 you code is wrong by checking "mid * mid == d"
you should return mid if abs(start-end)
as
【在 k****r 的大作中提到】 : function double sqrt(double d, int p). p is precision option. My code is as : follows. Please let me know if you see any error. Thanks, : public static double sqrt(double d, int p) { : if (d < 0) { : return Double.NaN; : } : double prec = Math.pow(10, - p); : double start = 0; : double end = d; : while (start < end) {
|
k****r 发帖数: 807 | 8 right. Thanks for the hint.
【在 D*******a 的大作中提到】 : you code is wrong by checking "mid * mid == d" : you should return mid if abs(start-end): : as
|
s**x 发帖数: 7506 | 9 if ( d < 0) return -1;
prec = ...;
start = d > 1 ? 1: d;
end = d > 1 ? d : 1;
While(1) {
m = (start + end) / 2;
v = m * m - d;
if(v > prec)
end = m;
else if( v < -prec)
start = m;
else
return m;
}
} |
N*****m 发帖数: 42603 | 10 newton's method
as
【在 k****r 的大作中提到】 : function double sqrt(double d, int p). p is precision option. My code is as : follows. Please let me know if you see any error. Thanks, : public static double sqrt(double d, int p) { : if (d < 0) { : return Double.NaN; : } : double prec = Math.pow(10, - p); : double start = 0; : double end = d; : while (start < end) {
|
k****r 发帖数: 807 | 11 thank you for the sharing. much more clear now.
【在 s**x 的大作中提到】 : if ( d < 0) return -1; : prec = ...; : start = d > 1 ? 1: d; : end = d > 1 ? d : 1; : While(1) { : m = (start + end) / 2; : v = m * m - d; : if(v > prec) : end = m; : else if( v < -prec)
|