Skip to content

Commit ec00343

Browse files
jogru0mbrubeck
authored andcommitted
refactor float hashing code
1 parent 59ba244 commit ec00343

File tree

1 file changed

+15
-19
lines changed

1 file changed

+15
-19
lines changed

src/lib.rs

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -166,12 +166,15 @@ impl<T: Float> PartialEq<T> for OrderedFloat<T> {
166166

167167
impl<T: Float> Hash for OrderedFloat<T> {
168168
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
172173
} else {
173-
hash_float(&self.0, state)
174-
}
174+
raw_double_bits(&self.0)
175+
};
176+
177+
bits.hash(state)
175178
}
176179
}
177180

@@ -955,7 +958,13 @@ impl<T: Float> Ord for NotNan<T> {
955958
impl<T: Float> Hash for NotNan<T> {
956959
#[inline]
957960
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)
959968
}
960969
}
961970

@@ -1278,22 +1287,9 @@ impl From<FloatIsNan> for std::io::Error {
12781287
}
12791288
}
12801289

1281-
#[inline]
1282-
fn hash_float<F: Float, H: Hasher>(f: &F, state: &mut H) {
1283-
raw_double_bits(f).hash(state);
1284-
}
1285-
12861290
#[inline]
12871291
fn raw_double_bits<F: Float>(f: &F) -> u64 {
1288-
if f.is_nan() {
1289-
return CANONICAL_NAN_BITS;
1290-
}
1291-
12921292
let (man, exp, sign) = f.integer_decode();
1293-
if man == 0 {
1294-
return CANONICAL_ZERO_BITS;
1295-
}
1296-
12971293
let exp_u64 = exp as u16 as u64;
12981294
let sign_u64 = if sign > 0 { 1u64 } else { 0u64 };
12991295
(man & MAN_MASK) | ((exp_u64 << 52) & EXP_MASK) | ((sign_u64 << 63) & SIGN_MASK)

0 commit comments

Comments
 (0)