在cython中指定大于long double的数字

时间:2015-03-12 01:09:29

标签: python c cython

我在 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)

如何避免为指数函数设置零值?

1 个答案:

答案 0 :(得分:0)

对于64位(甚至128位)浮点数,您将无法避免为0.0获取exp(-2.2e5)。这里可以做的是,

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