相关疑难解决方法(0)

如何在Haskell中提高这种数值计算的性能?

我正在将David Blei的潜在Dirichlet分配的原始C实现移植到Haskell,我正在尝试决定是否在C中留下一些低级别的东西.以下函数是一个例子 - 它是一个近似值的二阶导数lgamma:

double trigamma(double x)
{
    double p;
    int i;

    x=x+6;
    p=1/(x*x);
    p=(((((0.075757575757576*p-0.033333333333333)*p+0.0238095238095238)
         *p-0.033333333333333)*p+0.166666666666667)*p+1)/x+0.5*p;
    for (i=0; i<6 ;i++)
    {
        x=x-1;
        p=1/(x*x)+p;
    }
    return(p);
}
Run Code Online (Sandbox Code Playgroud)

我把它翻译成或多或少惯用的Haskell如下:

trigamma :: Double -> Double
trigamma x = snd $ last $ take 7 $ iterate next (x' - 1, p')
  where
    x' = x + 6
    p  = 1 / x' ^ 2
    p' = p / 2 + c / x'
    c  = foldr1 (\a b -> …
Run Code Online (Sandbox Code Playgroud)

c math performance haskell

48
推荐指数
2
解决办法
4651
查看次数

标签 统计

c ×1

haskell ×1

math ×1

performance ×1