@@ -166,12 +166,15 @@ impl<T: Float> PartialEq<T> for OrderedFloat<T> {
166
166
167
167
impl < T : Float > Hash for OrderedFloat < T > {
168
168
fn hash < H : Hasher > ( & self , state : & mut H ) {
169
- if self . is_nan ( ) {
170
- // normalize to one representation of NaN
171
- hash_float ( & T :: nan ( ) , state)
169
+ let bits = if self . is_nan ( ) {
170
+ CANONICAL_NAN_BITS
171
+ } else if self . is_zero ( ) {
172
+ CANONICAL_ZERO_BITS
172
173
} else {
173
- hash_float ( & self . 0 , state)
174
- }
174
+ raw_double_bits ( & self . 0 )
175
+ } ;
176
+
177
+ bits. hash ( state)
175
178
}
176
179
}
177
180
@@ -955,7 +958,13 @@ impl<T: Float> Ord for NotNan<T> {
955
958
impl < T : Float > Hash for NotNan < T > {
956
959
#[ inline]
957
960
fn hash < H : Hasher > ( & self , state : & mut H ) {
958
- hash_float ( & self . 0 , state)
961
+ let bits = if self . is_zero ( ) {
962
+ CANONICAL_ZERO_BITS
963
+ } else {
964
+ raw_double_bits ( & self . 0 )
965
+ } ;
966
+
967
+ bits. hash ( state)
959
968
}
960
969
}
961
970
@@ -1278,22 +1287,9 @@ impl From<FloatIsNan> for std::io::Error {
1278
1287
}
1279
1288
}
1280
1289
1281
- #[ inline]
1282
- fn hash_float < F : Float , H : Hasher > ( f : & F , state : & mut H ) {
1283
- raw_double_bits ( f) . hash ( state) ;
1284
- }
1285
-
1286
1290
#[ inline]
1287
1291
fn raw_double_bits < F : Float > ( f : & F ) -> u64 {
1288
- if f. is_nan ( ) {
1289
- return CANONICAL_NAN_BITS ;
1290
- }
1291
-
1292
1292
let ( man, exp, sign) = f. integer_decode ( ) ;
1293
- if man == 0 {
1294
- return CANONICAL_ZERO_BITS ;
1295
- }
1296
-
1297
1293
let exp_u64 = exp as u16 as u64 ;
1298
1294
let sign_u64 = if sign > 0 { 1u64 } else { 0u64 } ;
1299
1295
( man & MAN_MASK ) | ( ( exp_u64 << 52 ) & EXP_MASK ) | ( ( sign_u64 << 63 ) & SIGN_MASK )
0 commit comments