aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2024-06-26 20:46:46 +0200
committerGitHub <noreply@github.com>2024-06-26 20:46:46 +0200
commite37afa3ada710a0f4e38efc8889f15cce51b2d05 (patch)
treeec456b06156d0f4fad001cab024bd09119c4d758
parent3726f0b73c980fa7e14f3ed668bdf5ca3441e57a (diff)
parentc33bf7673f316733786813965b3934b1c9e8f6d4 (diff)
Merge pull request #3814 from Kelimion/fix_fixed
Fix core:math/fixed.
-rw-r--r--core/math/fixed/fixed.odin2
-rw-r--r--tests/core/math/fixed/test_core_math_fixed.odin51
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