diff --git a/c/main.c b/c/main.c index bd1b4ed..0392422 100644 --- a/c/main.c +++ b/c/main.c @@ -3,6 +3,11 @@ // #include +/** + * 69.Sqrt(x) + * @param x x + * @return 平方根 + */ int mySqrt(int x) { union { long long i; @@ -10,23 +15,28 @@ int mySqrt(int x) { }u; double xHalf = 0.5 * x; u.f = x; - u.i = 0x5FE6EC85E7DE30DALL - (u.i >> 1); - u.f = u.f * (1.5 - xHalf * u.f * u.f); - u.f = u.f * (1.5 - xHalf * u.f * u.f); - u.f = u.f * (1.5 - xHalf * u.f * u.f); - return 1.0 / u.f; + u.i = 0x1FF7A3BEA91D9B1B + (u.i >> 1); + u.f = u.f * 0.5 + xHalf / u.f; + u.f = u.f * 0.5 + xHalf / u.f; + u.f = u.f * 0.5 + xHalf / u.f; + return u.f; } +/** + * 69.Sqrt(x) + * @param x x + * @return 平方根 + */ int mySqrt1(int x) { double xHalf = 0.5 * x; double f = x; long long i = *(long long *) &f; - i = 0x5FE6EC85E7DE30DALL - (i >> 1); + i = 0x1FF7A3BEA91D9B1B + (i >> 1); f = *(double *) &i; - f = f * (1.5 - xHalf * f * f); // 牛顿迭代法,重复此句可提高精度 - f = f * (1.5 - xHalf * f * f); - f = f * (1.5 - xHalf * f * f); // 三次迭代 - return 1.0 / f; + f = f * 0.5 + xHalf / f; // 牛顿迭代法,重复此句可提高精度 + f = f * 0.5 + xHalf / f; + f = f * 0.5 + xHalf / f; // 三次迭代 + return f; } int main() {