给定x,求sqrt(x) 不允许调用系统sqrt()函数
方法一:牛顿迭代
#include<bits/stdc++.h>
using namespace std;
float SqrtByNewton(float x,float eps){
float val=x;
float last=x/2;
while((abs(last*last-val)>eps){
last=(last+val/last)/2;
}
return last;
}
int main(){
float x;
float eps;
cin>>x>>eps;
printf("%f\n",SqrtByNewton(x,eps));
return 0;
}
方法二:3D引擎中定点移位
关键:0x5f375a86
#include<bits/stdc++.h>
using namespace std;
float InvSqrt(float x)
{
float xhalf = 0.5f*x;
int i = *(int*)&x; // get bits for floating VALUE
i = 0x5f375a86- (i>>1); // gives initial guess y0
x = *(float*)&i; // convert bits BACK to float
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
return 1/x;
}
int main(){
float x;
cin>>x;
printf("%f\n",InvSqrt(x));
return 0;
}