Проверка на НАН в Cython - PullRequest
       5

Проверка на НАН в Cython

13 голосов
/ 20 ноября 2011

Я ищу способ проверить значения NaN в коде Cython.На данный момент я использую:

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

Есть ли лучший способ сделать это?Можно ли использовать такую ​​функцию, как Numpy's isnan?

Ответы [ 2 ]

19 голосов
/ 20 ноября 2011

Взято из 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
5 голосов
/ 17 ноября 2013

Если вы хотите убедиться, что ваш код также работает в 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, вы также можете вставить эти директивы прекомпилятора в файл .c, который генерирует cython:

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