|
|
#![no_std] |
|
|
|
|
|
|
|
|
#[cfg(test)] |
|
|
extern crate std; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
pub fn syf_core(f: f64, e: f64, k: f64) -> Result<f64, &'static str> { |
|
|
if f < 0.0 { |
|
|
return Err("F must be >= 0"); |
|
|
} |
|
|
if e < 0.0 || e > 1.0 { |
|
|
return Err("E must be in [0, 1]"); |
|
|
} |
|
|
if k <= 0.0 { |
|
|
return Err("K must be > 0"); |
|
|
} |
|
|
Ok((f * e) / k) |
|
|
} |
|
|
|
|
|
#[cfg(test)] |
|
|
mod tests { |
|
|
use super::syf_core; |
|
|
|
|
|
#[test] |
|
|
fn test_case_1() { |
|
|
let r = syf_core(10.0, 1.0, 2.0).unwrap(); |
|
|
assert!((r - 5.0).abs() < 1e-12); |
|
|
} |
|
|
|
|
|
#[test] |
|
|
fn test_case_2() { |
|
|
let r = syf_core(0.0, 0.5, 1.0).unwrap(); |
|
|
assert!((r - 0.0).abs() < 1e-12); |
|
|
} |
|
|
|
|
|
#[test] |
|
|
fn test_case_3() { |
|
|
let r = syf_core(4.0, 0.25, 2.0).unwrap(); |
|
|
assert!((r - 0.5).abs() < 1e-12); |
|
|
} |
|
|
|
|
|
#[test] |
|
|
fn test_invalid_f() { |
|
|
assert!(syf_core(-1.0, 0.5, 1.0).is_err()); |
|
|
} |
|
|
|
|
|
#[test] |
|
|
fn test_invalid_e_low() { |
|
|
assert!(syf_core(1.0, -0.1, 1.0).is_err()); |
|
|
} |
|
|
|
|
|
#[test] |
|
|
fn test_invalid_e_high() { |
|
|
assert!(syf_core(1.0, 1.1, 1.0).is_err()); |
|
|
} |
|
|
|
|
|
#[test] |
|
|
fn test_invalid_k() { |
|
|
assert!(syf_core(1.0, 0.5, 0.0).is_err()); |
|
|
assert!(syf_core(1.0, 0.5, -1.0).is_err()); |
|
|
} |
|
|
} |
|
|
|