我正在编写一个用于统计抽样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 40% 的时间用于计算斯特林对阶乘对数的近似值。我将我的优化工作集中在这部分上。这是我的代码(使用MPFR):
const double AL[8] =
{ 0.0, 0.0, 0.6931471806, 1.791759469, 3.178053830, 4.787491743,
6.579251212, 8.525161361 };
void HGD::mpfr_afc(mpfr_t &ret, const mpfr_t &val){
if(mpfr_cmp_ui(val, 7) <= 0){
mpfr_set_d(ret, AL[mpfr_get_ui(val, MPFR_RNDN)], MPFR_RNDN);
}else{
mpfr_set(ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.5, MPFR_RNDN);
mpfr_log(LV, val, MPFR_RNDN);
mpfr_mul(ret, LV, ret, MPFR_RNDN);
mpfr_sub(ret, ret, val, MPFR_RNDN);
mpfr_add_d(ret, ret, 0.399089934, MPFR_RNDN);
}
}
我有几个不同的想法:
- 预先计算超过函数的前 8 个输入。
- 优化数学(使用更粗略的近似以获得更小的精度)
- 使用多个线程并行计算不同的输入
- 当数字可以适合机器数据类型时切换到本机算术
我可以采取其他方法吗?