c++ - Ankerl快速指数算法简单解释

标签 c++ optimization exp

最近,我在寻找一种比数学 exp(x) 函数更快的替代方法。我发现了一些非常适合我的东西,这个解决方案通常被称为 Ankerl 算法。引用:

https://github.com/ekmett/approximate/blob/master/cbits/fast.c https://martin.ankerl.com/2012/01/25/optimized-approximative-pow-in-c-and-cpp/

C 上有典型的 Ankerl exp 函数实现

double exp_fast(double a)
{
   union { double d; long long x; } u;
   u.x = (long long)(6497320848556798LL * a + 0x3fef127e83d16f12LL);
   return u.d;
}

int main()
{
   for (float x = 0; x < 10; x += 0.01)
      std::cout << x << '\t'
      << exp(x) << '\t'
      << exp_fast(x)
      << std::endl;

   return 0;
}

不幸的是,我找不到这个算法的描述。也许在文献中它被称为其他东西。我试图绘制这个函数并且非常惊讶 - 这是指数函数的分段线性逼近!它可以在非常广泛的输出值范围内完美运行。所有图表包含大约一千个点(点击放大)

enter image description here enter image description here

尽管付出了所有努力,我还是无法确切地理解它是如何工作的。令我惊讶的是,这么简单的代码怎么能给出这么好的近似值。如果有人能清楚地解释这是如何工作的,以及选择值 6497320848556798LL0x3fef127e83d16f12LL 的考虑因素,我将不胜感激。第二件事 - 使用这样的解决方案是否安全,或者它是否是一种应该避免的肮脏黑客?

最佳答案

我认为这个算法来自论文A Fast, Compact Approximation of the Exponential Function由 Nicol N. Schraudolph 介绍。

论文的“算法”部分解释了它的工作原理。那里提供的代码也考虑了机器的字节顺序。

关于c++ - Ankerl快速指数算法简单解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53882855/

相关文章:

c++ - 解析网络头时字段的字节顺序

C++将两个不同类型的 vector 的属性连接到新 vector 中

c++ - 在 C++ 中高效使用 bool 值 true 和 false?

c++ - 使用 C++ 的 exp 函数

c++ - 处理字符串的类问题

python - Pyomo "data = None"输出错误

c++ - 是否有工具/解决方案来编写一个循环,其中仅在每 X 次迭代中检查条件?

c++ - visual studio 2015 exp 结果不同

python - 如何在 python 2.7 中使用 "e"(欧拉数)和电源操作

c++ - 鼠标事件QT