更快的数学算法牺牲了准确性

gra*_*ger 9 algorithm math

我正在开发一种游戏,它可以为物理和渲染调用许多数学函数.已知Quake3中使用的"Fast inverse sqrt"比sqrt()快,并且它的背景很漂亮.

您是否知道任何其他比平时更快的算法,并且具有可接受的准确度损失?

Ste*_*non 13

任何连续函数(包括最常见的数学运算)都可以通过多项式在有界区间内很好地近似.这与常见数学函数通常满足的相对简单的标识(如加法则)和表查找一起,提供了构建快速逼近算法的标准技术的基础(以及系统数学中使用的高精度方法的基础).图书馆).

泰勒系列通常是一个糟糕的选择; 对于大多数计算用途,Chebyshev或Minimax多项式具有更好的误差特性.拟合minimax多项式的标准技术是使用Remes的算法,该算法在许多商业数学软件中实现,或者如果你知道你正在做什么,你可以用一天的工作来完成你自己的实现.

为了记录,在现代处理器上应避免使用"快速反平方根",因为使用浮点倒数平方根估计指令(rsqrtss/ rsqrtps在SSE上,vrsqrte在NEON上,vrsqrtefp在AltiVec上)要快得多.在当前的英特尔处理器上,即使(非近似)硬件平方根也非常快.


nes*_*983 9

这些算法在文献中称为"近似算法".有大量例子的标准书是Vijay V. Vazirani的近似算法.

sin x ~~ x的情况是稍微更一般的特殊情况:查看函数的泰勒级数(或周期函数的傅里叶级数)并仅计算前几个项.

另一种(有点残酷的)技术是随机组合你的函数的几个点,然后对它进行线性回归.这样,你也可以得到一个很好的多项式来描述你的函数:).

  • 线性回归将导致"直线拟合" - 可能不是您想要的.但是你可以在最小二乘意义下拟合二次或三次多项式,这可能导致可接受的准确度. (2认同)
  • 我不同意.泰勒级数在它们计算点周围的小区域外具有较差的性质.您可以设法转换函数(例如,exp(x)= exp(x/2 ^ n)^(2 ^ n)使您只计算零附近的指数),或者您必须执行其他操作:minimax多项式逼近(难以计算(一次),但准确),或切比雪夫近似(易于计算,几乎同样准确).您确保准确度在整个感兴趣的领域**的受控范围内**. (2认同)

jk.*_*jk. 5

对于小x:sin(x)〜= x是经常用于物理学的