RD-1: Added an inital port of d_main.c/d_main.h. Added some other basic files
This commit is contained in:
47
src/math/m_fixed.rs
Normal file
47
src/math/m_fixed.rs
Normal file
@@ -0,0 +1,47 @@
|
||||
/* Implemnetation of *m_fixed.c/h
|
||||
|
||||
This provides fixed-point arithmetic as 32-bit 16.16
|
||||
*/
|
||||
|
||||
pub const FRACBITS: i32 = 16;
|
||||
pub const FRACUNIT: i32 = 1 << FRACBITS;
|
||||
|
||||
pub const MININT: i32 = 0x80000000;
|
||||
pub const MAXINT: i32 = 0x7fffffff;
|
||||
/// Struct representing a fixed point 32-bit value
|
||||
#[derive(Copy, Clone, PartialEq, Debug)]
|
||||
pub struct FixedPoint {
|
||||
pub value: i32,
|
||||
}
|
||||
|
||||
impl FixedPoint {
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn FixedMul(a: FixedPoint, b: FixedPoint) -> FixedPoint {
|
||||
let value = ((a.value as u64) * (b.value as u64) >> FRACBITS) as i32;
|
||||
FixedPoint{value}
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn FixedDiv(a: FixedPoint, b: FixedPoint) -> FixedPoint {
|
||||
if (i32::abs(a.value) >> 14) >= i32::abs(b.value) {
|
||||
if a.value^b.value == 0 {
|
||||
FixedPoint{value: MININT};
|
||||
}
|
||||
else {
|
||||
FixedPoint{value: MAXINT};
|
||||
}
|
||||
}
|
||||
FixedPoint::FixedDiv2(a,b)
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
pub fn FixedDiv2(a: FixedPoint, b: FixedPoint) -> FixedPoint {
|
||||
let c: f64 = ((a.value as f64) / (b.value as f64)) * FRACUNIT as f64;
|
||||
if c >= 2147483648.0 || c < -2147483648.0 {
|
||||
panic!("FixedDiv: divide by zero");
|
||||
}
|
||||
FixedPoint { value: c as i32 }
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user