@@ -157,12 +157,15 @@ impl<T: Float> PartialEq<T> for OrderedFloat<T> {
157
157
158
158
impl < T : Float > Hash for OrderedFloat < T > {
159
159
fn hash < H : Hasher > ( & self , state : & mut H ) {
160
- if self . is_nan ( ) {
161
- // normalize to one representation of NaN
162
- hash_float ( & T :: nan ( ) , state)
160
+ let bits = if self . is_nan ( ) {
161
+ CANONICAL_NAN_BITS
162
+ } else if self . is_zero ( ) {
163
+ CANONICAL_ZERO_BITS
163
164
} else {
164
- hash_float ( & self . 0 , state)
165
- }
165
+ raw_double_bits ( & self . 0 )
166
+ } ;
167
+
168
+ bits. hash ( state)
166
169
}
167
170
}
168
171
@@ -1015,7 +1018,13 @@ impl<T: Float> Ord for NotNan<T> {
1015
1018
impl < T : Float > Hash for NotNan < T > {
1016
1019
#[ inline]
1017
1020
fn hash < H : Hasher > ( & self , state : & mut H ) {
1018
- hash_float ( & self . 0 , state)
1021
+ let bits = if self . is_zero ( ) {
1022
+ CANONICAL_ZERO_BITS
1023
+ } else {
1024
+ raw_double_bits ( & self . 0 )
1025
+ } ;
1026
+
1027
+ bits. hash ( state)
1019
1028
}
1020
1029
}
1021
1030
@@ -1350,22 +1359,9 @@ impl From<FloatIsNan> for std::io::Error {
1350
1359
}
1351
1360
}
1352
1361
1353
- #[ inline]
1354
- fn hash_float < F : Float , H : Hasher > ( f : & F , state : & mut H ) {
1355
- raw_double_bits ( f) . hash ( state) ;
1356
- }
1357
-
1358
1362
#[ inline]
1359
1363
fn raw_double_bits < F : Float > ( f : & F ) -> u64 {
1360
- if f. is_nan ( ) {
1361
- return CANONICAL_NAN_BITS ;
1362
- }
1363
-
1364
1364
let ( man, exp, sign) = f. integer_decode ( ) ;
1365
- if man == 0 {
1366
- return CANONICAL_ZERO_BITS ;
1367
- }
1368
-
1369
1365
let exp_u64 = exp as u16 as u64 ;
1370
1366
let sign_u64 = ( sign > 0 ) as u64 ;
1371
1367
( man & MAN_MASK ) | ( ( exp_u64 << 52 ) & EXP_MASK ) | ( ( sign_u64 << 63 ) & SIGN_MASK )
0 commit comments