diff options
author | Tim Peters <tim.peters@gmail.com> | 2000-08-15 03:34:48 (GMT) |
---|---|---|
committer | Tim Peters <tim.peters@gmail.com> | 2000-08-15 03:34:48 (GMT) |
commit | 39dce29365d287dc6b353b2a527dc11fe58dcfa6 (patch) | |
tree | f24a592be4c36c5d1888fb0881e8535bf023e41b /Include | |
parent | 7aced17437a6b05bc4b0b5ff93aa6a5d3a374d68 (diff) | |
download | cpython-39dce29365d287dc6b353b2a527dc11fe58dcfa6.zip cpython-39dce29365d287dc6b353b2a527dc11fe58dcfa6.tar.gz cpython-39dce29365d287dc6b353b2a527dc11fe58dcfa6.tar.bz2 |
Fix for http://sourceforge.net/bugs/?func=detailbug&bug_id=111866&group_id=5470.
This was a misleading bug -- the true "bug" was that hash(x) gave an error
return when x is an infinity. Fixed that. Added new Py_IS_INFINITY macro to
pyport.h. Rearranged code to reduce growing duplication in hashing of float and
complex numbers, pushing Trent's earlier stab at that to a logical conclusion.
Fixed exceedingly rare bug where hashing of floats could return -1 even if there
wasn't an error (didn't waste time trying to construct a test case, it was simply
obvious from the code that it *could* happen). Improved complex hash so that
hash(complex(x, y)) doesn't systematically equal hash(complex(y, x)) anymore.
Diffstat (limited to 'Include')
-rw-r--r-- | Include/pyport.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/Include/pyport.h b/Include/pyport.h index 3d9b305..5bd641c 100644 --- a/Include/pyport.h +++ b/Include/pyport.h @@ -103,7 +103,7 @@ extern "C" { #define Py_ARITHMETIC_RIGHT_SHIFT(TYPE, I, J) ((I) >> (J)) #endif -/* Py_FORCE_EXPANSION +/* Py_FORCE_EXPANSION(X) * "Simply" returns its argument. However, macro expansions within the * argument are evaluated. This unfortunate trickery is needed to get * token-pasting to work as desired in some cases. @@ -123,6 +123,14 @@ extern "C" { #define Py_SAFE_DOWNCAST(VALUE, WIDE, NARROW) (NARROW)(VALUE) #endif +/* Py_IS_INFINITY(X) + * Return 1 if float or double arg is an infinity, else 0. + * Caution: + * X is evaluated more than once. + * This implementation may set the underflow flag if |X| is very small; + * it really can't be implemented correctly (& easily) before C99. + */ + #define Py_IS_INFINITY(X) ((X) && (X)*0.5 == (X)) /************************************************************************** Prototypes that are missing from the standard include files on some systems |