如何让向量快速单位化呢?

WJN92 2013-04-26 10:28:38
现在看到的书上都是使用 让向量除模长的方法,但是模长需要开方,比较慢,有没有什么比较快的方法呢?
...全文
1006 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
WJN92 2013-04-27
  • 打赏
  • 举报
回复
引用 5 楼 DelphiGuy 的回复:
如果算法允许的话,应该尽可能使用rsqrtps、rsqrtss(平方根的倒数),即便在老的Pentium4上也才4时钟延迟,在较新的snb、ivy架构上只有1时钟周期的延迟,carmack的快速算法再快也不可能这么快。sqrtss、sqrtsd、sqrtps、sqrtpd这些大致10~14时钟周期的延迟。
现在的计算这么快吗!? 看来我的汇编落伍了 这样看来直接使用cpu比什么算法、查表都要快
寻开心 2013-04-26
  • 打赏
  • 举报
回复
没有更快的办法, 数学公式就是那样 但是具体实现的时候, 1/sqrt函数的近似算法是可以优化的 下面是带注释的计算1/sqrt(x)算法, 来自Quake的源程序 float InvSqrt(float x) { float xhalf = 0.5f*x; int i = *(int*)&x; // get bits for floating value i = 0x5f375a86 - (i>>1); // hidden initial guess x = *(float*)&i; // convert bits back to float x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy // x = x*(1.5f-xhalf*x*x); // add this in for added precision, or many more... return x; } // InvSqrt 如果是double类型的计算,用0x5fe6ec85e7de30da。 但是值得注意的是第一次迭代的精度在 0.02 左右,第二次迭代精度在 5E-4 左右 这个是近似算法,在对速度要求很高,而对精度要求不是很高时可以考虑。
  • 打赏
  • 举报
回复
如果算法允许的话,应该尽可能使用rsqrtps、rsqrtss(平方根的倒数),即便在老的Pentium4上也才4时钟延迟,在较新的snb、ivy架构上只有1时钟周期的延迟,carmack的快速算法再快也不可能这么快。sqrtss、sqrtsd、sqrtps、sqrtpd这些大致10~14时钟周期的延迟。
WJN92 2013-04-26
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
可以使用SSEn指令,sqrtss、sqrtsd、sqrtps、sqrtpd、rsqrtps、rsqrtss。
不知道有没有一些效率对比的文章呢。 我现在就是不知道什么时候使用什么比较快
  • 打赏
  • 举报
回复
可以使用SSEn指令,sqrtss、sqrtsd、sqrtps、sqrtpd、rsqrtps、rsqrtss。
WJN92 2013-04-26
  • 打赏
  • 举报
回复
我现在考虑使用查表的方法快还是这种计算的速度快,不知道有没有相关的文章呢?

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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