处理大数字和精度的 Ricean Fading PDF python

Handling large numbers and precision of Ricean Fading PDF python

我正在尝试使用以下等式计算莱斯褪色 PDF。 RIcean Fading PDF。其中 'y' 是归一化包络,'gamma' 是 SNR

如果K值大,则

math.exp(-((1.+_gamma)*pow(_y,2.) + _gamma))

exp 导致大浮点数 (e.q. 1.01e-5088)。在 python 中,它将显示“0.0”作为值

mpmath.besseli(0,2. * _y * np.sqrt(_gamma * (1. + _gamma)))

贝塞尔函数的值显示大整数值(e.q。7.78e+5092)。在 python 中,它将显示“**inf**”值

如何在 python 中存储大整数和浮点值并计算 pdf?

def rice_pdf(self, _y, _gamma):
   return 2. * _y * (1. + _gamma) * math.exp(-((1.+_gamma)*pow(_y,2.) + _gamma)) * special.i0(2. * _y * np.sqrt(_gamma * (1. + _gamma))) 

谢谢。

如果你有办法计算贝塞尔函数的对数,你可以通过转换为求和并随后求幂来避免非常大和非常小的数字相乘,这应该可以解决数值问题(利用事实exp(a) * exp(b) == exp(a + b)).

def rice_pdf(_y, _gamma):
    a = np.log(2. * _y * (1. + _gamma))
    b = -((1.+_gamma)*pow(_y,2.) + _gamma)
    c = lni(2. * _y * np.sqrt(_gamma * (1. + _gamma))) 
    return np.exp(a + b + c)

此函数假定存在计算 log(i0(z))lni 的实现。但是,我知道没有现有的此类功能的实现。您可以通过对中间结果使用 mpmath 来解决此问题:

def lni(z):
    i0 = mpmath.besseli(0, z)  # may become a big number
    logi0 = mpmath.log(i0)  # logarithm brings big number into sensible range
    return float(logi0)  # convert back to normal floating point