69.Sqrt(x) c语言实现更改
This commit is contained in:
parent
69ded32ad3
commit
686499db7a
30
c/main.c
30
c/main.c
|
@ -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() {
|
||||||
|
|
Loading…
Reference in New Issue