From 1e00cc531007aa3418ad9deb7fbc5faaacce5795 Mon Sep 17 00:00:00 2001 From: mattip Date: Thu, 10 May 2018 09:42:17 +0300 Subject: [PATCH] DOC: expand reasoning behind npy_*floatstatus_barrer() --- doc/source/reference/c-api.coremath.rst | 15 +++++++++++++-- numpy/core/include/numpy/npy_math.h | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/doc/source/reference/c-api.coremath.rst b/doc/source/reference/c-api.coremath.rst index 8f76868282a3..ad92235da623 100644 --- a/doc/source/reference/c-api.coremath.rst +++ b/doc/source/reference/c-api.coremath.rst @@ -183,12 +183,19 @@ Those can be useful for precise floating point comparison. * NPY_FPE_UNDERFLOW * NPY_FPE_INVALID + Note that :c:func:`npy_get_floatstatus_barrier` is preferable as it prevents + agressive compiler optimizations reordering the call relative to + the code setting the status, which could lead to incorrect results. + .. versionadded:: 1.9.0 .. c:function:: int npy_get_floatstatus_barrier(char*) Get floating point status. A pointer to a local variable is passed in to - prevent aggresive compiler optimizations from reodering this function call. + prevent aggresive compiler optimizations from reodering this function call + relative to the code setting the status, which could lead to incorrect + results. + Returns a bitmask with following possible flags: * NPY_FPE_DIVIDEBYZERO @@ -202,9 +209,13 @@ Those can be useful for precise floating point comparison. Clears the floating point status. Returns the previous status mask. + Note that :c:func:`npy_clear_floatstatus_barrier` is preferable as it + prevents agressive compiler optimizations reordering the call relative to + the code setting the status, which could lead to incorrect results. + .. versionadded:: 1.9.0 -.. c:function:: int npy_clear_floatstatus(char*) +.. c:function:: int npy_clear_floatstatus_barrier(char*) Clears the floating point status. A pointer to a local variable is passed in to prevent aggresive compiler optimizations from reodering this function call. diff --git a/numpy/core/include/numpy/npy_math.h b/numpy/core/include/numpy/npy_math.h index 55e0fbc79573..582390cdcb87 100644 --- a/numpy/core/include/numpy/npy_math.h +++ b/numpy/core/include/numpy/npy_math.h @@ -528,10 +528,13 @@ int npy_clear_floatstatus_barrier(char*); int npy_get_floatstatus_barrier(char*); /* * use caution with these - clang and gcc8.1 are known to reorder calls - * to this form of the function which can defeat the check + * to this form of the function which can defeat the check. The _barrier + * form of the call is preferable, where the argument is + * (char*)&local_variable */ int npy_clear_floatstatus(void); int npy_get_floatstatus(void); + void npy_set_floatstatus_divbyzero(void); void npy_set_floatstatus_overflow(void); void npy_set_floatstatus_underflow(void);