在Cython中检查nan

15 投票
3 回答
4772 浏览
提问于 2025-04-17 06:41

我想找一种方法来检查Cython代码中的NaN值。目前,我使用的是:

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

有没有更好的方法呢?能不能像Numpy里的isnan那样使用一个函数?

3 个回答

0

我试过用 x != xmath.h 里的 isnan,发现这两种方法的速度差不多,而且都比 numpy 里的 np.isnan 快大约20倍。

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
27

摘自 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

撰写回答