近似e ^ x

tri*_*can 11 math optimization fpga

我想近似e x函数.

是否可以使用基于样条类型的多种方法来实现?之间即X 1X 2,然后

y 1 = 1 x + b 1,x 2和x 3之间,

然后

y 2 = a 2 x + b 2

等等

这适用于专用的fpga硬件,而不是通用CPU.因此我需要自己创建这个功能.准确性不是一个问题.此外,我实际上不能提供多个乘法电路和/或多个移位/加法器.另外,我想要比CORDIC功能小得多的东西,实际上尺寸很重要.

Luc*_*cas 24

如此使用公式的策略怎么样?

e x = 2 x/ln(2)

  1. 预先计算 1/ln(2)
  2. 将此常数乘以您的参数(1乘法)
  3. 使用二进制移位将2提升到幂的整数部分(假设为exp +尾数格式)
  4. 基于2的剩余幂的剩余部分进行调整(可能是第二次乘法)

我意识到这不是一个完整的解决方案,但它只需要一次乘法,并将剩余的问题减少到近似2的分数幂,这应该更容易在硬件中实现.

另外,如果您的应用程序是专业的话,你可以尝试重新获得所有的数字代码,将在你的硬件上运行是在一个碱基ë数字系统和实现浮点硬件基础工作é为好.然后根本不需要转换.

  • @trican有一篇关于实现此标识和范围缩减的文章很好,以使用查找表和定点算法实现单精度浮点的合理精度:http://www.loria.fr/~detreyje/publications/DetDin_fpt_2005.pdf (2认同)

tsk*_*zzy 13

If x是一个整数,你可以e一遍又一遍地自相乘.

如果x不是整数,您可以使用上述方法计算e floor(x),然后乘以一个小的校正项.可以使用多种近似方法容易地计算该校正项.一种这样的方式是这样的:

ë ˚F1 + f(1 + f/2(1 + f/3(1 + f/4))),其中˚F是x的分数部分

这来自于(优化的)幂级数展开的ë X,这对于小的值非常准确x.如果您需要更高的准确性,只需加入该系列的更多术语.

这个math.stackexchange问题包含一些额外的巧妙答案.

编辑:请注意,通过平方计算e n称为取幂的方法更快.

  • 整数解的最佳解决方案不是这个O(n)解决方案.分而治之算法(pre)计算e ^ 1,e ^ 2,e ^ 4,e ^ 8等.然后,你可以得到与`x`中的位相对应的因子.这是O(logN).即x = 255,这只需要8次乘法而不是254次. (2认同)