c - 德州仪器 CLA 浮点逆技巧 - 它的目的是什么
问题描述
我有这段由其他人编写的代码,它在 TI TMS320 命令法加速器上运行。因此,它在大小和速度上进行了优化。
为了得到 1/x,代码总是做这样的事情。
float32 y = __meinvf32(x);
y = y * (2.0f - y*x);
y = y * (2.0f - y*x);
我发现这个线程提出了类似的建议,但就我而言,最后没有夹紧。
有人能帮我理解这背后的意图吗?
解决方案
艾萨克牛顿想通了这一点。
__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界限的知识,我们可以计算出需要多少次重复才能使估计值尽可能接近正确结果。
推荐阅读
- node.js - 试图让 nginx 代理使用 docker 在 node.js 的端口 80 和 443 上工作
- unit-testing - 如何将 TDD 用于预期对某些输入不执行任何操作的方法?
- android - 如何在片段中使用 onBackPressed() 来支持 webview?
- javascript - 反应 | 如何通过 id/class 获取 div 的长度?
- c - Elf Symtab 解析空指针
- dart - ListView.builder 没有显示正确的列表
- r - 如何使用 geom_bar 优化图形 ggplot
- angular - 带有 Karma 和 ChromeHeadless 的 VSTS 托管 Linux 预览
- windows - system.net.sockets 和 windows 10 错误?
- regex - 用于提取连字符之间的每个单词的正则表达式