2011-11-20 52 views
9

Tôi đang tìm cách kiểm tra các giá trị NaN trong mã Cython. Hiện tại, tôi đang sử dụng:Kiểm tra nan trong Cython

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

Có cách nào tốt hơn để thực hiện việc này không? Có thể sử dụng một chức năng như Numpy's isnan?

+0

Có 'math.isnan'. Tôi không quen với Cython; bạn có thể sử dụng mô-đun dựng sẵn như vậy không? –

+1

(Có vẻ như bạn có thể, vì vậy tôi đã thực hiện một câu trả lời của nó.) –

Trả lời

11

Taken từ http://groups.google.com/group/cython-users/msg/1315dd0606389416, bạn có thể làm điều này:

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

Sau đó, bạn chỉ có thể sử dụng isnan(value).

Trong các phiên bản mới hơn của Cython, nó thậm chí còn dễ dàng hơn:

from libc.math cimport isnan 
5

Nếu bạn muốn chắc chắn rằng mã của bạn cũng hoạt động trên Windows, bạn nên sử dụng tốt hơn

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

vì trên Windows, theo như tôi biết, isnan được gọi là _isnan và được định nghĩa trong float.h

Xem thêm tại đây ví dụ: https://github.com/astropy/astropy/pull/186

Nếu bạn không muốn giới thiệu NumPy bạn cũng có thể chèn các chỉ thị tiền biên dịch vào file .c cython tạo:

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