use std::io::{stdout, Write};
use log2fix::*;
fn main() {
print!("Choose precision [1, 31]: ");
stdout().flush().unwrap();
let precision: u8 = get_input().trim().parse().unwrap();
if precision < 1 || precision > 31 {
println!("Wrong precision");
return;
}
let scale = 1u32 << precision;
let max_input = 1u32 << (32 - precision);
loop {
print!("x = ");
stdout().flush().unwrap();
let x: f32 = get_input().trim().parse().unwrap();
if x < 0.0 {
println!("x is negative!");
continue;
}
if x >= max_input as f32 {
println!("x is too big, max: {}", max_input);
}
println!(" loge({}) = {}", x, x.ln());
println!("logefix({}) = {}", x, logefix((x * scale as f32) as u32, precision) as f32 / scale as f32);
println!(" log2({}) = {}", x, x.log2());
println!("log2fix({}) = {}", x, log2fix((x * scale as f32) as u32, precision) as f32 / scale as f32);
println!(" log10({}) = {}", x, x.log10());
println!("log10fix({}) = {}", x, log10fix((x * scale as f32) as u32, precision) as f32 / scale as f32);
println!();
}
}
fn get_input() -> String {
let mut buffer = String::new();
std::io::stdin().read_line(&mut buffer).expect("Failed to read input");
buffer
}