Merge pull request #725 from DarkWarrior703/patch-4

Create sqrt_double
This commit is contained in:
Stepfen Shawn 2020-04-27 08:34:16 +08:00 committed by GitHub
commit 0577096360
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

36
math/sqrt_double.cpp Normal file
View File

@ -0,0 +1,36 @@
#include <iostream>
#include <cassert>
/* Calculate the square root of any
number in O(logn) time,
with precision fixed */
double Sqrt(double x) {
double l = 0, r = x;
/* Epsilon is the precision.
A great precision is
between 1e-7 and 1e-12.
double epsilon = 1e-12;
*/
double epsilon = 1e-12;
while ( l <= r ) {
double mid = (l + r) / 2;
if ( mid * mid > x ) {
r = mid;
} else {
if ( x - mid * mid < epsilon ) {
return mid;
}
l = mid;
}
}
return -1;
}
int main() {
double n{};
std::cin >> n;
assert(n >= 0);
// Change this line for a better precision
std::cout.precision(12);
std::cout << std::fixed << Sqrt(n);
}