倍精度特殊関数を実装する最新の方法は何ですか?:私は、次の積分必要 ため、M=0、1、2、。。。そして、t>0で、これは下側の不完全ガンマ関数で書くことができます。これが私のFortranとCの実装です。
https://gist.github.com/3764427
これは級数展開を使用し、指定された精度になるまで項を合計し、再帰関係を使用してより低い値を効率的に取得します。私はそれをうまくテストし、必要なすべてのパラメーター値に対して1e-15の精度を取得しました。詳細については、Fortranバージョンのコメントを参照してください。
それを実装するより良い方法はありますか?以下は、gfortranでのガンマ関数の実装です。
https://github.com/mirrors/gcc/blob/master/libgfortran/intrinsics/c99_functions.c#L1781
私がしている無限級数を合計する代わりに、有理関数近似を使用しています。均一な精度を得る必要があるので、これはより良いアプローチだと思います。これらのものにアプローチするためのいくつかの標準的な方法はありますか、または各特別な関数の特別なアルゴリズムを理解する必要がありますか?
アップデート1:
コメントに基づいて、SLATECを使用した実装を次に示します。
https://gist.github.com/3767621
おおよそ1e-15の精度で、私自身の関数の値を再現します。ただし、t = 1e-6およびm = 50の場合、項は1e-303に等しくなり、より高い "m"の場合は、誤った答えを出し始めます。Fmに直接級数展開/再帰関係を使用するため、関数にこの問題はありません。正しい値の例を次に示します。
、(1e-6)=4.97511945200351715E-003
しかし、分母が爆発するため、SLATECを使用してこれを取得することはできません。ご覧のとおり、実際の値は小さく、小さくなっています。
アップデート2:
上記の問題を回避するために、1機能を使用することができますdgamit
(Tricomiの不完全ガンマ関数)を、そしてF(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2
、その問題がないもはや、残念ながら吹くアップのためのM ≈ 172。しかし、これは十分に高いかもしれませんメートルgamma(m+0.5_dp)
私の目的のために。