在Cython中检查nan

ast*_*rog 13 python cython

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

if value != value:
    # value is NaN
else:
    # value is not NaN
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?是否可以使用像Numpy这样的功能isnan

Chr*_*gan 21

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

cdef extern from "math.h":
    bint isnan(double x)
Run Code Online (Sandbox Code Playgroud)

然后你可以使用isnan(value).

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

from libc.math cimport isnan
Run Code Online (Sandbox Code Playgroud)


cpa*_*lik 5

如果您想确保您的代码也可以在Windows上运行,那么最好使用它

cdef extern from "numpy/npy_math.h":
    bint npy_isnan(double x)
Run Code Online (Sandbox Code Playgroud)

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

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

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

#if defined(WIN32) || defined(MS_WINDOWS)
#define USEMATH_DEFINES
#define isnan(x) _isnan(x)
#endif
Run Code Online (Sandbox Code Playgroud)