如何让Python ufuncs返回超出常规浮点数大小上限的结果?
报错原因
scipy.special下的gamma ufunc本身未实现对float128输入类型的支持,因此输入float128数组时会触发类型不兼容报错。另外并不是Python ufunc本身无法处理大于1.8e308的浮点数,只是默认双精度float64的数值上限为~1.8e308,float128的数值上限更高,但需要对应的ufunc实现针对float128做适配才能使用。
可行解决方案
- 优先使用对数gamma函数:如果后续计算可以基于gamma的对数结果完成(比如概率计算、乘积求和类运算),直接调用
scipy.special.gammaln即可,它返回gamma函数值的自然对数,x=260时返回值仅约为1211,完全在float64的表示范围内,不会出现溢出问题,同时保留原生ufunc的向量化运算性能,是绝大多数场景下的最优解。 - 高精度库逐元素计算:如果必须获取gamma的原始数值,可以使用mpmath等高精度计算库的
mpmath.gamma函数,可自定义精度表示远大于1.8e308的数值,缺点是不支持NumPy数组向量化运算,需要逐元素处理,性能较低。 - 自定义支持float128的ufunc:如果需要保留float128的向量化运算能力,可以使用Numba等工具自行实现支持float128输入的gamma ufunc,Numba内置的gamma函数原生支持float128类型输入。
内容的提问来源于stack exchange,提问作者Josh Pinto
相关产品推荐
相关产品推荐

