游戏开发论坛

 找回密码
 立即注册
搜索
查看: 9809|回复: 18

解释一下这个开方函数。。。。

[复制链接]

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2007-7-31 23:02:00 | 显示全部楼层 |阅读模式
float Q_rsqrt( float number )
{
        long i;
        float x2, y;
        const float threehalfs = 1.5F;

        x2 = number * 0.5F;
        y  = number;
        i  = * ( long * ) &y;                        // evil floating point bit level hacking
        i  = 0x5f3759df - ( i >> 1 );               // what the ****?
        y  = * ( float * ) &i;
        y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//        y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

#ifndef Q3_VM
#ifdef __linux__
        assert( !isnan(y) ); // bk010122 - FPE?
#endif
#endif
        return y;
}

有谁见过这个函数??解释一下。。我看了好久,用泰勒公式怎么不像啊。。。。

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2007-8-1 01:04:00 | 显示全部楼层

Re:解释一下这个开方函数。。。。

这是Quake3里的开方函数吧!

据说一个数学家,花了2个星期才研究出来是怎么回事。

然后花了2个月时间写出了一个比Quake3更快更准的开方函数。

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-8-1 09:03:00 | 显示全部楼层

Re:解释一下这个开方函数。。。。

牛顿迭代法,但那个魔数怎么被卡马克弄到的就不知道了
数学家先生自己推算了一个理论上最好的,结果比卡马克的差,但他又通过一个个测试的方法得到了一个数0x5f375a86比卡马克的好

0

主题

28

帖子

33

积分

注册会员

Rank: 2

积分
33
QQ
发表于 2007-8-1 19:06:00 | 显示全部楼层

Re:解释一下这个开方函数。。。。

啊,他还试出来了啊,晕

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2007-8-1 19:19:00 | 显示全部楼层

Re:解释一下这个开方函数。。。。

一个例子:如何用微积分法求根号3的近似值?
sqrt( 3 ) = sqrt( 2.89 + 0.11 ) 约等于 1.7 + 0.5 * ( 1 / 1.7 ) * 0.11 = 1.7 + 0.032352941176470588235294117647059 约等于 1.7325

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2007-8-1 23:05:00 | 显示全部楼层

Re:解释一下这个开方函数。。。。

loushang shenme yisi?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2007-8-1 23:49:00 | 显示全部楼层

Re:解释一下这个开方函数。。。。

还是别用这个,在Quake3的时代没错。

但在现在的机器上,可以试一下,不管是Microsoft还是Borland的标准C函数库里的sqrt都比这个快(而且更精确)。更不用说intel math 库里的那个了。

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
 楼主| 发表于 2007-8-2 13:17:00 | 显示全部楼层

我是搂主 :0

果然有人认出来了,我花了两个小时去找以前学过的知识,才发现这是用泰勒公式推出来的著名牛顿迭代法。

开方的迭代式如下:

X(k+1)=X(k)*3/2-(X(k)^3)/2     //就是上面那个

而在牛顿里面,最主要的找到初始迭代值,使得f(X(k))/f'(X(k))<0 && f(X(k+1))/f'(X(k+1))>0

quake里面用的是一个浮点数转长整型后用一个很奇怪的数0x5f3759df "整型"相减,然后再变回来.
如果是按IEEE 745标准来算,这个数实在是没什么意思,是个很小的数,但是整型相减他就很大了,减去要计算的数.
这里仿佛找不到什么数学依据,i(转整后),右移一位是干什么的?是为了把指数部分的符号去掉变成一个大数么?

谁能解答??

还有,这个函数本身与机器没什么关系,很奇怪的是,我用它在quake工程里用,很正常,试了了几个数.
可是我用在自己的文件里面就不知道为什么不准了.

还有intel math里面函数像什么样子,能展出来看看么?

看来高手还是很多的.

"天下岂无马耶,实无伯乐已"

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
 楼主| 发表于 2007-8-2 13:22:00 | 显示全部楼层

补一句:给 "敢问2007"

关键是离预算数最近的平方数如何得.

我在开泰勒公式的时候也想过,只要一次两次iterate就能得出较为好的值,可是quake那个是为了找这个么?
怎么想都不清楚.

11

主题

112

帖子

112

积分

注册会员

Rank: 2

积分
112
发表于 2007-8-2 20:04:00 | 显示全部楼层

Re: Re:解释一下这个开方函数。。。。

CLOD: Re:解释一下这个开方函数。。。。

loushang shenme yisi?

你连这都不懂,还学游戏开发?妈的还说我好蠢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 13:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表