首页 > 解决方案 > 德州仪器 CLA 浮点逆技巧 - 它的目的是什么

问题描述

我有这段由其他人编写的代码,它在 TI TMS320 命令法加速器上运行。因此,它在大小和速度上进行了优化。

为了得到 1/x,代码总是做这样的事情。

float32 y = __meinvf32(x); 
y = y * (2.0f - y*x); 
y = y * (2.0f - y*x);

我发现这个线程提出了类似的建议,但就我而言,最后没有夹紧。

有人能帮我理解这背后的意图吗?

标签: cembedded

解决方案


艾萨克牛顿想​​通了这一点。

__meinvf32(x)给出 1/ x的近似值,例如 1/ x • (1+ e ),其中e是一些小的相对误差。

y = 1/ x • (1+ e )。然后,当我们计算y • (2 − y •<em>x) 时,我们有:

  • y • (2 - y •<em>x) =
  • (1/ x • (1+ e )) • (2 - (1/ x • (1+ e ))•<em>x) =
  • 1/ x • (1+ e ) • (2 - (1+ e )) =
  • 1/ x • (2 + 2 e - (1+ e ) - e (1+ e )) =
  • 1/ x • (2 + 2 e - 1 - e - e - e 2 ) =
  • 1/ x • (1 - e 2 )。

由于e很小,所以e 2更小。因此,通过计算 y • (2 − y •<em>x),我们得到比以前更接近的 1/ x的估计值;相对误差仅为 -<em>e 2而不是e。重复此操作会再次改进估计(达到浮点精度的限制)。

有了一些关于初始e界限的知识,我们可以计算出需要多少次重复才能使估计值尽可能接近正确结果。


推荐阅读