69.Sqrt(x) c语言实现更改

This commit is contained in:
游由 2021-11-11 14:52:39 +08:00
parent 69ded32ad3
commit 686499db7a
1 changed files with 20 additions and 10 deletions

View File

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