From 686499db7ac1e0520b6f43684ec7b0449a505b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=B8=E7=94=B1?= Date: Thu, 11 Nov 2021 14:52:39 +0800 Subject: [PATCH] =?UTF-8?q?69.Sqrt(x)=20c=E8=AF=AD=E8=A8=80=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c/main.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) 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() {