aboutsummaryrefslogtreecommitdiff
path: root/azalea-core/src/math.rs
diff options
context:
space:
mode:
Diffstat (limited to 'azalea-core/src/math.rs')
-rw-r--r--azalea-core/src/math.rs28
1 files changed, 24 insertions, 4 deletions
diff --git a/azalea-core/src/math.rs b/azalea-core/src/math.rs
index 83e6020e..aa9d88c8 100644
--- a/azalea-core/src/math.rs
+++ b/azalea-core/src/math.rs
@@ -13,15 +13,15 @@ pub static SIN: LazyLock<[f32; 65536]> = LazyLock::new(|| {
/// A sine function that uses a lookup table.
pub fn sin(x: f32) -> f32 {
let x = x * 10430.378;
- let x = x as usize;
- SIN[x & 65535]
+ let x = x as i32 as usize & 65535;
+ SIN[x]
}
/// A cosine function that uses a lookup table.
pub fn cos(x: f32) -> f32 {
let x = x * 10430.378 + 16384.0;
- let x = x as usize;
- SIN[x & 65535]
+ let x = x as i32 as usize & 65535;
+ SIN[x]
}
// TODO: make this generic
@@ -83,4 +83,24 @@ mod tests {
assert_eq!(gcd(12, 7), 1);
assert_eq!(gcd(7, 12), 1);
}
+
+ #[test]
+ fn test_sin() {
+ const PI: f32 = std::f32::consts::PI;
+ // check that they're close enough
+ fn assert_sin_eq_enough(number: f32) {
+ let a = sin(number);
+ let b = f32::sin(number);
+ assert!((a - b).abs() < 0.01, "sin({number}) failed, {a} != {b}");
+ }
+ assert_sin_eq_enough(0.0);
+ assert_sin_eq_enough(PI / 2.0);
+ assert_sin_eq_enough(PI);
+ assert_sin_eq_enough(PI * 2.0);
+ assert_sin_eq_enough(PI * 3.0 / 2.0);
+ assert_sin_eq_enough(-PI / 2.0);
+ assert_sin_eq_enough(-PI);
+ assert_sin_eq_enough(-PI * 2.0);
+ assert_sin_eq_enough(-PI * 3.0 / 2.0);
+ }
}