mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-24 08:41:34 +11:00
GREEN: Fudge fractional and integral bits to get negative numbers to work
This commit is contained in:
parent
413a819e64
commit
89f89803dd
|
@ -454,13 +454,19 @@ fn test_rem_euclid_is_always_positive_and_sensible(_gba: &mut super::Gba) {
|
||||||
|
|
||||||
impl<I: FixedWidthUnsignedInteger, const N: usize> Display for Num<I, N> {
|
impl<I: FixedWidthUnsignedInteger, const N: usize> Display for Num<I, N> {
|
||||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||||
let integral = self.0 >> N;
|
let mut integral = self.0 >> N;
|
||||||
let mask: I = (I::one() << N) - I::one();
|
let mask: I = (I::one() << N) - I::one();
|
||||||
|
|
||||||
|
let mut fractional = self.0 & mask;
|
||||||
|
|
||||||
|
if fractional != I::zero() && integral < I::zero() {
|
||||||
|
integral = integral + I::one();
|
||||||
|
fractional = (I::one() << N) - fractional;
|
||||||
|
}
|
||||||
|
|
||||||
write!(f, "{}", integral)?;
|
write!(f, "{}", integral)?;
|
||||||
|
|
||||||
let mut fractional = self.0 & mask;
|
if fractional != I::zero() {
|
||||||
if fractional & mask != I::zero() {
|
|
||||||
write!(f, ".")?;
|
write!(f, ".")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -562,7 +568,7 @@ mod formatting_tests {
|
||||||
use alloc::format;
|
use alloc::format;
|
||||||
|
|
||||||
#[test_case]
|
#[test_case]
|
||||||
fn formats_numbers_correctly(_gba: &mut crate::Gba) {
|
fn formats_whole_numbers_correctly(_gba: &mut crate::Gba) {
|
||||||
let a = Num::<i32, 8>::new(-4i32);
|
let a = Num::<i32, 8>::new(-4i32);
|
||||||
|
|
||||||
assert_eq!(format!("{}", a), "-4");
|
assert_eq!(format!("{}", a), "-4");
|
||||||
|
@ -577,6 +583,7 @@ mod formatting_tests {
|
||||||
let b: Num<i32, 8> = a / two;
|
let b: Num<i32, 8> = a / two;
|
||||||
let c: Num<i32, 8> = b * minus_one;
|
let c: Num<i32, 8> = b * minus_one;
|
||||||
|
|
||||||
|
assert_eq!(b + c, 0.into());
|
||||||
assert_eq!(format!("{}", b), "1.25");
|
assert_eq!(format!("{}", b), "1.25");
|
||||||
assert_eq!(format!("{}", c), "-1.25");
|
assert_eq!(format!("{}", c), "-1.25");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue