diff options
| author | Jeroen van Rijn <Kelimion@users.noreply.github.com> | 2024-06-26 20:46:46 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-26 20:46:46 +0200 |
| commit | e37afa3ada710a0f4e38efc8889f15cce51b2d05 (patch) | |
| tree | ec456b06156d0f4fad001cab024bd09119c4d758 | |
| parent | 3726f0b73c980fa7e14f3ed668bdf5ca3441e57a (diff) | |
| parent | c33bf7673f316733786813965b3934b1c9e8f6d4 (diff) | |
Merge pull request #3814 from Kelimion/fix_fixed
Fix core:math/fixed.
| -rw-r--r-- | core/math/fixed/fixed.odin | 2 | ||||
| -rw-r--r-- | tests/core/math/fixed/test_core_math_fixed.odin | 51 |
2 files changed, 52 insertions, 1 deletions
diff --git a/core/math/fixed/fixed.odin b/core/math/fixed/fixed.odin index d55e24175..b23090307 100644 --- a/core/math/fixed/fixed.odin +++ b/core/math/fixed/fixed.odin @@ -41,7 +41,7 @@ init_from_f64 :: proc(x: ^$T/Fixed($Backing, $Fraction_Width), val: f64) { init_from_parts :: proc(x: ^$T/Fixed($Backing, $Fraction_Width), integer, fraction: Backing) { x.i = fraction x.i &= 1<<Fraction_Width - 1 - x.i |= integer + x.i |= (integer << Fraction_Width) } to_f64 :: proc(x: $T/Fixed($Backing, $Fraction_Width)) -> f64 { diff --git a/tests/core/math/fixed/test_core_math_fixed.odin b/tests/core/math/fixed/test_core_math_fixed.odin new file mode 100644 index 000000000..4fcd63422 --- /dev/null +++ b/tests/core/math/fixed/test_core_math_fixed.odin @@ -0,0 +1,51 @@ +package test_core_math_fixed + +import "core:math/fixed" +import "core:testing" + +@test +test_fixed_4_4_unsigned :: proc(t: ^testing.T) { + I_SHIFT :: 4 + F_MASK :: 15 + F_ULP :: 0.0625 + Fixed :: fixed.Fixed(u8, 4) + + for c in 0..<256 { + raw := u8(c) + fv := transmute(Fixed)raw + + i := raw >> I_SHIFT + f := raw & F_MASK + expected := f64(i) + F_ULP * f64(f) + + testing.expectf(t, fixed.to_f64(fv) == expected, "Expected Fixed(u8, 4)(%v) to equal %.5f, got %.5f", raw, expected, fixed.to_f64(fv)) + } +} + +@test +test_fixed_4_4_signed :: proc(t: ^testing.T) { + I_SHIFT :: 4 + F_MASK :: 15 + F_ULP :: 0.0625 + Fixed :: fixed.Fixed(i8, 4) + + for c in 0..<256 { + raw := i8(c) + fv := transmute(Fixed)raw + + f := raw & F_MASK + expected: f64 + if c < 128 { + i := raw >> I_SHIFT + expected = f64(i) + F_ULP * f64(f) + } else if c == 128 { + expected = 8.0 + + } else if c > 128 { + i := i8(-8) + i += (raw & 0b0111_0000) >> I_SHIFT + expected = f64(i) + F_ULP * f64(f) + } + testing.expectf(t, fixed.to_f64(fv) == expected, "Expected Fixed(i8, 4)(%v, %v) to equal %.5f, got %.5f", c, raw, expected, fixed.to_f64(fv)) + } +}
\ No newline at end of file |