关闭

[转贴]John Carmack密码:0x5f3759df

标签: float算法blogurl
1065人阅读 评论(0) 收藏 举报
分类:

有人在Quake III的源代码里面发现这么一段用来求平方根的代码:

/*
================
SquareRootFloat
================
*/
float SquareRootFloat(float number) {
long i;
float x, y;
const float f = 1.5F;

x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 ); //注意这一行
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return number * y;
}
普渡大学的数学家Chris Lomont采用暴力方法得到的更好上那么一丁点的值是:0x5f375a86
学过数值分析就知道,算法里面求平方根一般采用的是无限逼近的方法,比如牛顿迭代法,卡马克的不同之处在于,
他选择了一个神秘的猜测值0x5f3759df作为起始,使得整个逼近过程收敛速度暴涨,对于Quake III所要求的
精度10的负三次方,只需要一次迭代就能够得到结果。
From:http://sd.csdn.net/n/20060607/91403.html
original url from Blog: http://sd.csdn.net/n/20060607/91403.html
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:41195次
    • 积分:579
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:10篇
    • 译文:0篇
    • 评论:18条
    文章存档
    最新评论