3 ms·
The hash is the same. But a hash set has to use == in case of equal hashes (to avoid collisions).
by Jaxan 7mo ago
The hash is the same. But a hash set has to use == in case of equal hashes (to avoid collisions).
- kubb 7mo agoIt's not always the same: >>> hash(float('nan')) 271103401 >>> hash(float('nan')) 271103657
- zahlman 7mo agoYes. The CPython hash algorithm for floats (https://github.com/python/cpython/blob/main/Python/pyhash.c#L87 https://github.com/python/cpython/blob/main/Python/pyhash.c#...) special-cases the non-finite values: floating-point infinities hash to special values modeled on the digits of pi (seriously! See https://github.com/python/cpython/blob/main/Include/cpython/pyhash.h#L19 https://github.com/python/cpython/blob/main/Include/cpython/...), and NaNs fall through ultimately to https://github.com/python/cpython/blob/main/Include/internal/pycore_pyhash.h#L10 https://github.com/python/cpython/blob/main/Include/internal... which is based on object identity (the pointer to the object is used rather than its data).
- 1-more 7mo agomaybe it's that multiple bit patterns can be NaN and these are two different ones? In IEEE-754, a number with all the exponent bits set to 1 is +/-infinity if the fraction bits are all zero, otherwise it's NaN. So these could be values where the fractions differ. Can you see what the actual bits it's setting are?