Skip to content

Instantly share code, notes, and snippets.

@rust-play
Created November 2, 2019 12:42
Show Gist options
  • Save rust-play/88e38e48f19ff4c3ff238d2a6216de84 to your computer and use it in GitHub Desktop.
Save rust-play/88e38e48f19ff4c3ff238d2a6216de84 to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
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