You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中处理传入Scipy/Numpy的极小数值(<1e-15)?

解决方案

1. 利用特殊函数的互补逆函数(最优解)

scipy.special 中的 gammaincinv 和 gammainccinv 存在互补关系:
gammaincinv(k, 1 - a) = gammainccinv(k, a)
因为正则化不完全伽马函数的补函数满足 1 - gammainc(k, x) = gammaincc(k, x),其逆函数自然继承了这个等价转换逻辑。完全不需要计算 1 - a,直接传入极小值 a 即可避开精度问题:

from scipy.special import gammainccinv

a = 1e-18
result = gammainccinv(10, a)

该方法依赖 scipy 原生函数,无精度损失,也不需要额外依赖库。

2. 使用更高精度的浮点数类型

如果遇到没有互补函数的场景,可以用 numpy 的 longdouble 类型(平台相关,通常为 80/128 位精度)计算 1 - a,它能保留极小值的精度,且多数 scipy 特殊函数支持 longdouble 输入:

import numpy as np
from scipy.special import gammaincinv

a = np.longdouble(1e-18)
x = 1 - a  # 此时x不会被截断为1.0,可保留1 - 1e-18的精度
result = gammaincinv(10, x)

计算完成后,可根据需求将结果转换为普通 float 类型(精度允许的情况下),或继续用 longdouble 处理。

3. 临时转换 mpmath 数值为兼容类型(备选)

如果必须用 mpmath 计算参数,可将其高精度数值转换为 numpy 的 longdouble(scipy 对 decimal 支持有限,不推荐),再传入 scipy 函数:

import mpmath
from scipy.special import gammaincinv
import numpy as np

mpmath.mp.dps = 30  # 设置足够的精度
a = mpmath.mpf("1e-18")
x = 1 - a
# 转换为numpy longdouble以兼容scipy
x_ld = np.longdouble(str(x))
result = gammaincinv(10, x_ld)

注意转换过程中避免精度损失,优先使用前两种方案。


内容的提问来源于stack exchange,提问作者Geoff2009max

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:10:16