在 cython 中指定大于长双精度的数字



我在cython中编写了一个函数,该函数使用math.h c库中exp函数。由于指数函数的输入是x=222442.837696值,并且该函数应该返回exp(-x),因此它只返回0.0。我定义了数学库的输入值如下:

cdef extern from "math.h":
    long double exp(double) nogil
    double log(double) nogil
    double atanh(double) nogil
    double sqrt(double) 
    double atan(double) nogil
    double atan2(double, double) 
    double sin(double x) 
    double cos(double x) 
    double fabs(double x)
    double pow(double,double) 

作为更大类一部分的函数是

def MassFunction(self, z, mass):
    #Halo mass function based on Evrard et al. 2002
    cdef double a= 0.281
    cdef double b= 0.0123
    cdef double sigma_f=0.578
    cdef double log_sigma=-log(sigma_f)+a*log(mass)+b*log(mass)*log(mass)
    cdef double alpha= a+2*b*log(mass)
    return (0.315*self.rho_m(z)/mass)*alpha*exp(-1*pow(fabs(log_sigma+0.61),3.8))*self.comoving_volume(z)

如何避免指数函数的值为零?

您将无法避免获得 64 位(甚至 128 位)浮点数的exp(-2.2e5) 0.0。这里要做的是,

  • 将库用于任意精度算术(如 GMP),但在这种情况下,您可能会降低性能。
  • 手动重写最终表达式以计算质量的对数,然后应用指数函数。这将解决您的问题,假设MassFunction的结果在合理的范围内(例如在 1e-991e99 之间)。

最新更新