平方根计算方法(平方根的公式)

豆子1周前 (04-11)内容专栏100

平方根计算方法

(arithmeticsquareroot),是一种方根。一个正数有两个实平方根,它们互为相反数,

现在回过头来看看如何利用牛顿法来解决我们的问题。求平方根的倒数,实际就是求方程1/(x^2)-a=0的解。将该方程按牛顿迭代法的公式展开为:

平方根计算方法(平方根的公式)

x[n+1]=x[n]-f(x[n])/f'(x[n])NR最关键的地方在于估计第一个近似根。如果该近似根与真根足够靠近的话,那么只需要少数几次迭代,就可以得到满意的解。

接着,我们要设法估计第一个近似根。这也是上面的函数最神奇的地方。它通过某种方法算出了一个与真根非常接近的近似根,因此它只需要使用一次迭代过程就获得了较满意的解。它是怎样做到的呢?所有的奥妙就在于这一行:

平方根的公式

所以,所谓的MagicNumber,并不是从N元宇宙的某个星系由于时空扭曲而掉到地球上的,而是几百年前就有的数学理论。只要熟悉NR和泰勒级数,你我同样有能力作出类似的优化。

Carmack在QUAKE3中使用了下面的算法,它第一次在公众场合出现的时候,几乎震住了所有的人。据说该算法其实并不是Carmack发明的,它真正的作者是Nvidia的GaryTarolli(未经证实)。

在3D图形编程中,经常要求平方根或平方根的倒数,例如:求向量的长度或将向量归一化。C数学函数库中的sqrt具有理想的精度,但对于3D游戏程式来说速度太慢。我们希望能够在保证足够的精度的同时,进一步提高速度。

那个MagicNumber是可以推导出来的,但我并不打算在这里讨论,因为实在太繁琐了。简单来说,其原理如下:因为IEEE的浮点数中,尾数M省略了最前面的1,所以实际的尾数是1+M。如果你在大学上数学课没有打瞌睡的话,那么当你看到(1+M)^(-1/2)这样的形式时,应该会马上联想的到它的泰勒级数展开,而该展开式的第一项就是常数。下面给出简单的推导过程:

平方根口诀表

x[n+1]=1/2*x[n]*(3-a*x[n]*x[n])将1/2放到括号里面,就得到了上面那个函数的倒数第二行。

这个算法依赖于浮点数的内部表示和字节顺序,所以是不具移植性的。如果放到Mac上跑就会挂掉。如果想具备可移植性,还是乖乖用sqrt好了。但算法思想是通用的。大家可以尝试推算一下相应的平方根算法。

在GameDev.net上有人做过测试,该函数的相对误差约为0.177585%,速度比C标准库的sqrt提高超过20%。如果增加一次迭代过程,相对误差可以降低到e-004的级数,但速度也会降到和sqrt差不多。据说在DOOM3中,Carmack通过查找表进一步优化了该算法,精度近乎完美,而且速度也比原版提高了一截(正在努力弄源码,谁有发我一份)。

下面给出Carmack在QUAKE3中使用的平方根算法。Carmack已经将QUAKE3的所有源代码捐给开源了,所以大家可以放心使用,不用担心会收到律师信。

相关文章

更新重置成本(重置成本的四种计算方法)

更新重置成本(重置成本的四种计算方法)

更新重置成本 重置成本是现在时点的成本,它强调站在企业主体角度,以投入到某项资产上的价值作为重置成本。在实务中,重置成本多应用于盘盈 现代建筑或制造标准、新型设计、规格和技术等,以现行价格水平购建与评...

加权平均法公式(加权平均法最简单的例子)

加权平均法公式(加权平均法最简单的例子)

加权平均法公式 但因为老板说的话分量比你重,假如老板的权重是2,你是1,这时求平均值就是加权平均了,结果是(100*1+60*2)/(1+2)=73.3分,显然向你的老板那里倾斜了. 权重是一个相对的...

万有引力公式(高中物理向心力6个公式)

万有引力公式(高中物理向心力6个公式)

万有引力公式 以及两个物体之间的距离有关。物体的质量越大,它们之间的万有引力就越大;物体之间的距离越远,它们之间的万有引力就越小。 我们把各种飞行器围绕地球做圆轨道运动的速度叫做第一宇宙速度,也称“...

根与系数的关系(韦达定理7个公式归纳)

根与系数的关系(韦达定理7个公式归纳)

根与系数的关系 根与系数的关系一般指的是一元二次方程ax2+bx+c=0的两个根x1,x2与系数的关系。即x1+x2=-b/a,x1·x2=c/a,这个公式通常称为韦达定理。 第四种方法:因式分解法。...

自由落体时间公式(下落高度与时间的公式)

自由落体时间公式(下落高度与时间的公式)

自由落体时间公式 自由落体公式:初速度Vo=0,末速度V=gt,下落高度h=1/2gt2。自由落体是指常规物体只在重力的作用下,初速度为零的运动,叫做自由落体运动。 亚里士多德的论断影响深远,在其后...

内部收益率公式(IRR公式计算讲解)

内部收益率公式(IRR公式计算讲解)

内部收益率公式 如果没有0年度,仅仅从第1年末到第20年末,那么只有19个整年,那么就是把20年投资收益,当作19年的投资收益来计算,就会算出一个偏高的IRR值。 因为单纯从保单表面上看,不同产品时...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。