diff --git a/src/lib.rs b/src/lib.rs index 09bc502..4b5efbc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +mod ops; + pub const M_BITS: u8 = 5; pub const E_BITS: u8 = 3; const E_CAP: u8 = 4; diff --git a/src/ops.rs b/src/ops.rs new file mode 100644 index 0000000..2ce284e --- /dev/null +++ b/src/ops.rs @@ -0,0 +1,35 @@ +use super::*; + +impl std::ops::Add for F8 { + type Output = Self; + + fn add(self, rhs: Self) -> Self::Output { + let (m1, e1) = self.split_unbias(); + let (m2, e2) = rhs.split_unbias(); + if e1 < e2 { + return rhs + self; + } + if rhs.0 == 0 { + return self; + } + let e_diff = e1 - e2; + let m = m1 + (m2 >> e_diff); + Self::merge_unbias(m, e1) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_add() { + assert_eq!(F8::from(0b0011) + F8::from(0b0000), F8::from(0b0011)); + assert_eq!(F8::from(0b0000) + F8::from(0b0111), F8::from(0b0111)); + assert_eq!(F8::from(0b0011) + F8::from(0b0101), F8::from(0b1000)); + assert_eq!(F8::from(0b0101) + F8::from(0b0011), F8::from(0b1000)); + assert_eq!(F8::from(0b0011) + F8::from(0b0110), F8::from(0b1001)); + assert_eq!(F8::from(0b0011) + F8::from(0b0111), F8::from(0b1010)); + assert_eq!(F8::from(0b1100) + F8::from(0b0001), F8::from(0b1101)); + } +}