Created
November 2, 2019 12:42
-
-
Save rust-play/88e38e48f19ff4c3ff238d2a6216de84 to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fn smart_8_to_5(n: u8) -> u8 { | |
(((n as u32) * 31 + 30) / 255) as u8 | |
} | |
fn dumb_8_to_5(n: u8) -> u8 { | |
(((n as u32) * 31) / 255) as u8 | |
} | |
fn just_5_to_8(n: u8) -> u8 { | |
(((n as u32) * 255) / 31) as u8 | |
} | |
fn balanced_5_to_8(n: u8) -> u8 { | |
((n as u32) * 8 + 3) as u8 | |
} | |
fn balanced_8_to_5(n: u8) -> u8 { | |
n / 8 | |
} | |
type F = fn(u8) -> u8; | |
#[derive(Debug, Copy, Clone)] | |
struct Sample { | |
n8: u8, | |
n5: u8, | |
n8b: u8, | |
n5b: u8, | |
} | |
impl Sample { | |
fn se8(&self) -> f64 { | |
(self.n8b as f64 - self.n8 as f64).powi(2) | |
} | |
fn se5(&self) -> f64 { | |
(self.n5b as f64 - self.n5 as f64).powi(2) | |
} | |
} | |
fn main() { | |
for (name, f_8_to_5, f_5_to_8) in [ | |
("dumb", dumb_8_to_5 as F, just_5_to_8 as F), | |
("smart", smart_8_to_5 as F, just_5_to_8 as F), | |
("balanced", balanced_8_to_5 as F, balanced_5_to_8 as F), | |
] | |
.iter() | |
{ | |
println!("{}", name); | |
let mut last_n5: u8 = 255; | |
let samples: Vec<Sample> = (0u8..=255u8).map(|n8| { | |
let n5: u8 = f_8_to_5(n8); | |
let n8b: u8 = f_5_to_8(n5); | |
let n5b: u8 = f_8_to_5(n8b); | |
let oops = n5 != n5b; | |
if n5 != last_n5 { | |
println!(); | |
last_n5 = n5; | |
} | |
println!( | |
"{:4} {:3} -> {:2} -> {:3} -> {:2}", | |
if oops { "oops" } else { "" }, | |
n8, | |
n5, | |
n8b, | |
n5b | |
); | |
Sample { | |
n8, | |
n5, | |
n8b, | |
n5b, | |
} | |
}).collect(); | |
let sse8: f64 = samples.iter().map(Sample::se8).sum(); | |
let mse8: f64 = sse8 / samples.len() as f64; | |
let sse5: f64 = samples.iter().map(Sample::se5).sum(); | |
let mse5: f64 = sse5 / samples.len() as f64; | |
println!(); | |
println!("mse8 {:2.3}", mse8); | |
println!("mse5 {:2.3}", mse5); | |
println!(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment