来自libm*.so的__ieee754_exp_avx在某个源代码中被密集使用,我想用更快的exp(x)实现替换它?
自定义exp(x):
inline double exp2(double x) { x = 1.0 + x / 1024; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; x *= x; return x; }
我应该使用什么gcc标签来使gcc自动使用自定义exp(x)实现?如果gcc无法实现,我该怎么办呢?
https://codingforspeed.com/using-faster-exponential-approximation/
别.此函数比本机实现慢exp
,并且是非常差的近似值.
首先是速度.我的基准测试表明,根据你的编译器和CPU,这个实现exp2
可能比本机慢 1.5到4.5倍exp
.我不确定网站在哪里得到他们的数据 - "比传统的快360倍exp
"似乎很荒谬,并且与我的测试完全不一致.
第二,准确性.exp2(x)
是相当接近exp(x)
的x ? 1
,但是没有很糟糕的较大值.例如:
exp(1) = 2.7182818 exp2(1) = 2.7169557 (0.05% too low) exp(2) = 7.3890561 exp2(2) = 7.3746572 (0.20% too low) exp(5) = 148.41316 exp2(5) = 146.61829 (1.21% too low) exp(10) = 22026.466 exp2(10) = 20983.411 (4.74% too low) exp(20) = 4.851652e+08 exp2(20) = 4.0008755e+08 (17.5% too low)
虽然你从这个功能的网站声称"非常好的输入小于5"的协议,这是不正确的.1.21%的差异(for x=5
)是巨大的,并且可能在使用此近似的任何计算中导致显着误差.