summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormattip <matti.picus@gmail.com>2018-05-10 09:42:17 +0300
committermattip <matti.picus@gmail.com>2018-05-10 09:42:17 +0300
commit1e00cc531007aa3418ad9deb7fbc5faaacce5795 (patch)
treed91a1a628429afc789c4d0553ad89c5bb168a400
parentf5758d6fe15c2b506290bfc5379a10027617b331 (diff)
downloadnumpy-1e00cc531007aa3418ad9deb7fbc5faaacce5795.tar.gz
DOC: expand reasoning behind npy_*floatstatus_barrer()
-rw-r--r--doc/source/reference/c-api.coremath.rst15
-rw-r--r--numpy/core/include/numpy/npy_math.h5
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 8f7686828..ad92235da 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 55e0fbc79..582390cdc 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);