【问题标题】:Fast approximation of square_root(x) with known 0<=x<=1已知 0<=x<=1 的 square_root(x) 的快速逼近
【发布时间】:2017-01-11 03:50:05
【问题描述】:

如果我知道x&lt;=1,如何近似sqrt(float32bit x)?

必须有一些技巧来利用x&lt;=1 范围。

返回结果不必精确,最大误差可能是&lt;0.001。
(0.001 只是一个神奇的数字,你可以改变它。)

我不介意语言,但我更喜欢 C++,在 CPU(不是 GPU)中。
我认为显式公式比查表更好。

它对我的 3D 游戏(VS 2015 + Ogre3D + Bullet)中的粒子很有用,但我找不到任何关于它的线索。
我怀疑投票风暴的原因是它看起来像一个作业/面试?
...或者解决方案已经众所周知?

【问题讨论】:

  • @Mark Ransom 是否依赖于平台?
  • @javaLover 这个技巧没有高效的、符合标准的实现,但它相当可移植。

标签: c++ algorithm square-root


【解决方案1】:

平方根通常通过 FSQRT which getting increasingly faster 计算。这是一个你几乎无法击败的单一指令。例如,快速反平方根将无济于事,除非您可以直接使用它的结果。如果您必须再次反转它,仅 FDIV 将花费大约与 FSQRT 一样多的时间。

【讨论】:

  • 谢谢!这是一个有价值的信息!现在我将停止寻找这个东西。
  • 你不需要除以使用平方根倒数。 1/(1/√x) == x*(1/√x).
  • @javaLover 在你停止寻找之前你可能想看看Why is SSE scalar sqrt(x) slower than rsqrt(x) * x?。
  • @MarkRansom:除非 x=0(和无穷大,但这里不感兴趣),因此必须将其作为乘法方法的特殊情况处理,因为它包含在对提问者感兴趣。
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2015-06-15
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多