mirror of
https://github.com/python/cpython.git
synced 2025-09-27 10:50:04 +00:00
Added a new macro, Py_IS_FINITE(X). On windows there is an intrinsic for this and it is more efficient than to use !Py_IS_INFINITE(X) && !Py_IS_NAN(X). No change on other platforms
This commit is contained in:
parent
4b4e33ef14
commit
f94323fbb4
3 changed files with 12 additions and 5 deletions
|
@ -295,6 +295,15 @@ extern "C" {
|
||||||
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
|
#define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Py_IS_INFINITY(X)
|
||||||
|
* Return 1 if float or double arg is an infinity, else 0.
|
||||||
|
* This some archicetcures (windows) have intrisics for this, so a special
|
||||||
|
* macro for this particular test is useful
|
||||||
|
*/
|
||||||
|
#ifndef Py_IS_FINITE
|
||||||
|
#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))
|
||||||
|
#endif
|
||||||
|
|
||||||
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
|
/* HUGE_VAL is supposed to expand to a positive double infinity. Python
|
||||||
* uses Py_HUGE_VAL instead because some platforms are broken in this
|
* uses Py_HUGE_VAL instead because some platforms are broken in this
|
||||||
* respect. We used to embed code in pyport.h to try to worm around that,
|
* respect. We used to embed code in pyport.h to try to worm around that,
|
||||||
|
|
|
@ -384,7 +384,7 @@ float_richcompare(PyObject *v, PyObject *w, int op)
|
||||||
if (PyFloat_Check(w))
|
if (PyFloat_Check(w))
|
||||||
j = PyFloat_AS_DOUBLE(w);
|
j = PyFloat_AS_DOUBLE(w);
|
||||||
|
|
||||||
else if (Py_IS_INFINITY(i) || Py_IS_NAN(i)) {
|
else if (!Py_IS_FINITE(i)) {
|
||||||
if (PyInt_Check(w) || PyLong_Check(w))
|
if (PyInt_Check(w) || PyLong_Check(w))
|
||||||
/* If i is an infinity, its magnitude exceeds any
|
/* If i is an infinity, its magnitude exceeds any
|
||||||
* finite integer, so it doesn't matter which int we
|
* finite integer, so it doesn't matter which int we
|
||||||
|
@ -802,10 +802,7 @@ float_pow(PyObject *v, PyObject *w, PyObject *z)
|
||||||
* bug; we let that slide in math.pow() (which currently
|
* bug; we let that slide in math.pow() (which currently
|
||||||
* reflects all platform accidents), but not for Python's **.
|
* reflects all platform accidents), but not for Python's **.
|
||||||
*/
|
*/
|
||||||
if (iv == -1.0 && !Py_IS_INFINITY(iw) && iw == iw) {
|
if (iv == -1.0 && Py_IS_FINITE(iw)) {
|
||||||
/* XXX the "iw == iw" was to weed out NaNs. This
|
|
||||||
* XXX doesn't actually work on all platforms.
|
|
||||||
*/
|
|
||||||
/* Return 1 if iw is even, -1 if iw is odd; there's
|
/* Return 1 if iw is even, -1 if iw is odd; there's
|
||||||
* no guarantee that any C integral type is big
|
* no guarantee that any C integral type is big
|
||||||
* enough to hold iw, so we have to check this
|
* enough to hold iw, so we have to check this
|
||||||
|
|
|
@ -162,6 +162,7 @@ typedef int pid_t;
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#define Py_IS_NAN _isnan
|
#define Py_IS_NAN _isnan
|
||||||
#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X))
|
#define Py_IS_INFINITY(X) (!_finite(X) && !_isnan(X))
|
||||||
|
#define Py_IS_FINITE(X) _finite(X)
|
||||||
|
|
||||||
#endif /* _MSC_VER */
|
#endif /* _MSC_VER */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue