我在 cython 中编写了一个函数,该函数使用来自exp
math.h
库的c
函数。由于指数函数的输入为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)
如何避免为指数函数设置零值?
答案 0 :(得分:0)
对于64位(甚至128位)浮点数,您将无法避免为0.0
获取exp(-2.2e5)
。这里可以做的是,
MassFunction
的结果在合理范围内(例如,在1e-99
和1e99
之间),这将解决您的问题。