求double sqrt(double i);实现!

chencyy1 2006-05-19 04:48:47
小弟用单片机c编程中遇到开方问题,不能是库函数。由于对开方的算法不懂,
特求double sqrt(double i);的实现,望各位大虾给个函数实现原代码!
...全文
863 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
guochun 2007-01-10
  • 打赏
  • 举报
回复
人们很早就在Quake3源代码中发现了如下的C代码,它可以快速的求1/sqrt(x),在3D图形
向量计算方面应用很广。
float InvSqrt(float x){
float xhalf=0.5f*x;
long i=*(long*)&x;
i=0x5f3759df - (i>>1);
x=*(float *)&i;
x=x*(1.5f-xhalf*x*x);
return x;
}
Beyond3D.com的Ryszard Sommefeldt一直在想到底是哪个家伙写了这些神奇的代码?2003
年Chris Lomont还写了一篇文章(PDF)对这些代码进行了分析。毫无疑问写出这些代码的
人绝对是天才。
是John Carmack?Michael Abrash?John Carmack在邮件回复中明确表示不是他,也不是
Michael,可能是Terje Matheson。于是侦探Ryszard又向Terje Mathisen寻求答案。
Terje说他写过类似的高效代码,但上面的不是。他猜测可能在MIT的旧文档中可以找到。
Ryszard的求证之路显然无止境。
mazhahn 2006-05-22
  • 打赏
  • 举报
回复
好像初中的数学课本上讲过手动开平方的算法,不过是选修内容
很想问问有没有手动开立方的方法
chencyy1 2006-05-22
  • 打赏
  • 举报
回复
谢谢大家了!
由于我对牛顿迭代法求根号没有研究过,所以来求函数实现,我就根据自己的要求散分了!
我啃 2006-05-20
  • 打赏
  • 举报
回复
牛顿迭代法求根号,大学里学过的
delphihero 2006-05-20
  • 打赏
  • 举报
回复
同样牛顿迭代法,求出来的是1/sqrt(d)。只迭代两次。e-5 精度不知是否满足,不满足自己加迭代次数,感觉单片机应该速度第一,用float 可能更好,搂住可以看看我转的文章
http://blog.csdn.net/delphihero/archive/2006/02/24/608040.aspx
double InvSqrt(double number)
{
__int64 i;
double x2, y;
const double threehalfs = 1.5F;

x2 = number * 0.5F;
y = number;
i = * ( __int64 * ) &y;
i = 0x5fe6ec85e7de30da - ( i >> 1 );
y = * ( double * ) &i;
y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration
y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed
return y;
}
double d = 4.0000;
d = d*InvSqrt(d);
f_acme 2006-05-19
  • 打赏
  • 举报
回复
迭代法开平方:
#include<stdio.h>
#include<math.h>
#define EPS 1e-20
int main(void)
{
long double x0,x1,x;
while(1)
{
scanf("%llf",&x);
if(!x) break;
x1=1.0;
do{
x0=x1;
x1=(x1+x/x1)/2;
}while(fabs(x1-x0)>=EPS);
printf("%.16llf\n",x1);
}
return 0;
}
niatclock 2006-05-19
  • 打赏
  • 举报
回复
就是采用迭代法
niatclock 2006-05-19
  • 打赏
  • 举报
回复

main()
{
float a,x1,x2;
printf("\n输入正数a的值为:");
scanf("%f",&a);
if(a==0)
printf("\n%f的平方根值为:%f\n\n",a,a);//b的输入考虑小数点位数就更逼真了
else
{
x1=a/2;
x2=(x1+a/x1)/2;
while((x2-x1)>=1e-5||(x1-x2)>=1e-5)
{
x1=(x2+a/x2)/2;
x2=(x1+a/x1)/2;
}
printf("\n%f的平方根值为:%f\n\n",a,x2);
}
}

偶的这个程序好像能实现,你试试吧。
chencyy1 2006-05-19
  • 打赏
  • 举报
回复
小弟用单片机c编程中遇到开方问题,不能调用sqrt()库函数。由于对开方的算法不懂,
特求double sqrt(double i);的实现,望各位大虾给个函数实现原代码!

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧