德州仪器CLA浮点反向技巧-其目的是什么

德州仪器CLA浮点反向技巧-其目的是什么,c,embedded,C,Embedded,我有一段代码是由其他人编写的,它运行在TI TMS320命令法加速器上。因此,它的尺寸和速度都得到了优化 为了得到1/x,代码总是这样做 float32 y = __meinvf32(x); y = y * (2.0f - y*x); y = y * (2.0f - y*x); 我发现他们提出了一些类似的建议,但在我的例子中,最后没有夹紧 seomebody能帮助我理解这背后的意图吗?y=e+1/x,其中e是一些小错误 所以(2.0-y*x)接近于1.0,并且在每次传递中都有减少e的效果。

我有一段代码是由其他人编写的,它运行在TI TMS320命令法加速器上。因此,它的尺寸和速度都得到了优化

为了得到1/x,代码总是这样做

float32 y = __meinvf32(x); 
y = y * (2.0f - y*x); 
y = y * (2.0f - y*x);
我发现他们提出了一些类似的建议,但在我的例子中,最后没有夹紧


seomebody能帮助我理解这背后的意图吗?

y=e+1/x,其中e是一些小错误


所以(2.0-y*x)接近于1.0,并且在每次传递中都有减少e的效果。

艾萨克·牛顿发现了这一点

\uuu meinvf32(x)
给出了1/x的近似值,比如1/x•(1+e),其中e是一些较小的相对误差

设y=1/x•(1+e)。那么,当我们计算y•(2− y•x),我们有:

  • y•(2)− y•x)=
  • (1/x•(1+e))•(2− (1/x•(1+e))•x)=
  • 1/x•(1+e)•(2)− (1+e))=
  • 1/x•(2+2e)− (1+e)− e(1+e))=
  • 1/x•(2+2e)− 1.− E− E− (e2)=
  • 1/x•(1)− e2)
由于e很小,e2甚至更小。因此,通过计算y•(2− y•x)我们得到的估计值为1/x,比以前更接近;相对误差仅为−e2代替e。重复此操作可再次提高估计值(达到浮点精度的极限)

通过了解初始e的界限,我们可以计算出需要多少次重复才能使估计尽可能接近正确的结果。

Ref解释了第一步。接下来的两个看起来像是两个回合。不确定div by 0问题。