最新的实现双精度特殊功能的方式是什么?我需要以下积分: 对于和,可以用较低的不完全伽马函数来表示。这是我的Fortran和C实现:米=0,1,2,。。。
https://gist.github.com/3764427
它使用级数展开,将各项相加直到达到给定的精度,然后使用递归关系有效地获得较低值。我对其进行了很好的测试,获得了我需要的所有参数值的1e-15精度,有关详细信息,请参见Fortran版本的注释。
有没有更好的方法来实现它?这是gfortran中的gamma函数实现:
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”,它只是开始给出错误的答案。我的函数没有这个问题,因为我直接对使用了一系列扩展/递归关系。这是一个正确值的示例: ˚F米
(1e-6)=4.97511945200351715E-003
,
但是我无法使用SLATEC来实现这一点,因为分母会爆炸。如您所见,的实际值很小。
更新2:
为避免上述问题,可以使用该函数dgamit
(Tricomi的不完全Gamma函数),然后F(m, t) = dgamit(m+0.5_dp, t) * gamma(m+0.5_dp) / 2
,因此不再存在问题,但是不幸的是,。然而,这可能是足够高的,我的目的。米≈ 172 米gamma(m+0.5_dp)