Java实现
牛顿迭代法:
double sqrt(double c)
{
if(c<0)return Double.NaN;
double err=1e-15;
double c=t;
while(Math.abs(t-c/t)>err*t)
{
t=(t+c/t)/2.0;
}
return t;
}
C/C++实现
3d游戏引擎算法实现1/sqrt(x),改一下返回值成为sqrt()算法:
float _sqrt(float t)
{
float thalf=0.5f*t;
int i = *(int *)&t;//get bytes for floating VALUE 很神奇的一步
i = 0x5f375a86 - (i >> 1); //gives initial guess y0; 这个数字也是很神奇的
t= *(float*)&i;//convert bits Back to float
t = t* (1.5f-thalf*t*t);//牛顿迭代法
t = t * (1.5f - thalf * t*t);//牛顿迭代法
t = t * (1.5f - thalf * t*t);//牛顿迭代法
return 1/t;
}
1/sqrt():平方根的倒数算法
float _sqrt(float t)
{
float thalf=0.5f*t;
int i = *(int *)&t;//get bytes for floating VALUE 很神奇的一步
i = 0x5f375a86 - (i >> 1); //gives initial guess y0; 这个数字也是很神奇的
t= *(float*)&i;//convert bits Back to float
t = t* (1.5f-thalf*t*t);//牛顿迭代法
t = t * (1.5f - thalf * t*t);//牛顿迭代法
t = t * (1.5f - thalf * t*t);//牛顿迭代法
return t;
}
这两个算法都非原创,只是在这里记载一下,各位大神不喜勿喷。
另外第二个算法是个很有意思的故事。这里贴下链接https://blog.csdn.net/qq_26499321/article/details/73724763