在Cython中检查nan

时间:2011-11-20 08:23:49

标签: python cython

我正在寻找一种在Cython代码中检查NaN值的方法。目前,我正在使用:

if value != value:
    # value is NaN
else:
    # value is not NaN

有更好的方法吗?是否可以使用像Numpy的isnan

这样的函数

3 个答案:

答案 0 :(得分:18)

取自http://groups.google.com/group/cython-users/msg/1315dd0606389416,你可以这样做:

cdef extern from "math.h":
    bint isnan(double x)

然后你可以使用isnan(value)

在较新版本的Cython中,它更容易:

from libc.math cimport isnan

答案 1 :(得分:5)

如果您想确保您的代码也适用于Windows,则最好使用

cdef extern from "numpy/npy_math.h":
    bint npy_isnan(double x)

因为在Windows上,据我所知,isnan被称为_isnan并在float.h中定义

另请参见此处:https://github.com/astropy/astropy/pull/186

如果您不想引入numpy,您还可以将这些预编译器指令插入到cython生成的.c文件中:

#if defined(WIN32) || defined(MS_WINDOWS)
#define USEMATH_DEFINES
#define isnan(x) _isnan(x)
#endif

答案 2 :(得分:0)

我尝试了x != x的{​​{1}}和isnan,发现性能几乎相同,并且两种方法的速度比{{1}中的math.h快20倍}。