世界上最快的浮点开方算法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
世界上最快的浮点开方算法

 任何一个3D引擎都是通过其内部的数学模型和实现工具来展现它的力量与速度的,Quake?III中使用了一个非常有意思的技巧来计算平方根倒数(inverse?square?root)   Carmacks?不寻常平方根倒数?卡马克算法   第一个跳出来的便是对函数Q_rsqrt中对0x5f3759df的使用,这个数计算了一个浮点数的inverse?square?root,但是为什么这个函数有这样的功能呢??   观察q_math.c原本的函数:?    [c-sharp]?view plaincopyprint? 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?);?? ??y??=?*?(?float?*?)?i;?? ??y??=?y?*?(?threehalfs?-?(?x2?*?y?*?y?)?);?//?1st?iteration???? ??y??=?y?*?(?threehalfs?-?(?x2?*?y?*?y?)?);?//?2nd?iteration,?this?can?be?removed???? y??=?y?*?(?threehalfs?-?(?x2?*?y?*?y?)?);//增加精度值 ??return?y;???//返回倒数? }????   它不仅有效,甚至在某些CPU上,Carmack的Q_rsqrt?比(float)(1.0/sqrt(x)的计算快4倍,尽管sqrt()通常使用的是FSQRT的汇编指令!   在另一个文件code/common/cm_trace.c?中,我们发现了更简洁的对同样HACK的实现。这一次,它被用来计算一个float?-?sqrt(x)的平方根。注意,其中的唯一不同是在返回值上--用返回*y取代了返回y。??    [c-sharp]?view plaincopyprint? 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;????//返回开方 }???   牛顿对根的近似值?   上面的代码执行了众所周知的牛顿对根的近似值,像绝大多数其它迭代求近似值的计算一样,牛顿近似值假定是迭代的;每一次迭代都增强了它的准确度直至达到需要的准确度。   在牛顿近似值中的一般想法是我们我们猜测一个数x的平方根值y,我们可能通过一个简单的操作用x/y来拉平y来取得更好的猜测,使其更接近实际的平方根,例如,我们像下面这样计算2的平方根,我们假定初始的猜测是1:    [c-sharp]?view plaincopyprint? 2/1?=?2?;??(2?+?1)?/?2?=?1.5??? 2/1.5?=?1.3333;?(?1.5?+?1.3333?)?/?2?=?1.4167??? 2/1.4167?=?1.4117;??(?1.4167?+?1.4117?)?/?2?=?1.4142??? And?so?on...????   如前面所提到的,牛顿的近似值是一个大家所熟知的用以快速计算平方根的方法。但是,Carmack在初始的猜测中就选取的不寻常的值,它彻底加强了准确度并且将Quake?III中计算所要的值的迭代次数降到了1次! 魔数?   这个函数中真正有意思的方面是神奇的常量0x5f3759df,用来计算初始猜测的,在?    [c-sharp]?view plaincopyprint? i??=?0x5f3759df?-?(?i??1?);????     因此,把输入除以2并从神奇常量中减去。这个常

文档评论(0)

wnqwwy20 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档