我在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-99
和1e99
之间)。