来自 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
的 native 实现慢,并且是一个极差的近似值。
首先,速度。我的基准测试表明,根据您的编译器和 CPU,exp2
的这种实现可能比原生 exp
快 1.5 到 4.5 倍慢>。我不确定网站从哪里得到他们的数据——“比传统的 exp
快 360 倍”似乎很荒谬,而且与我的测试完全不一致。
其次,准确性。对于 x ≤ 1
,exp2(x)
相当接近 exp(x)
,但对于较大的值则严重失败。例如:
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% 的差异(对于 x=5
)是巨大的,并且很可能在使用此近似值的任何计算中导致重大错误。
关于c++ - 如何从源代码或库中替换 __ieee754_exp_avx 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41723001/