include generator in consts.rs

This commit is contained in:
Trevor Spiteri 2020-04-16 23:05:53 +02:00
parent 5db3b17284
commit 68c0fa6f8d
1 changed files with 80 additions and 0 deletions

View File

@ -33,6 +33,86 @@ assert_eq!(format!("{:.8}", tau), "6.28318531");
use crate::types::{U0F128, U1F127, U2F126, U3F125};
/*
```rust
use core::{cmp::Ord, convert::TryFrom};
use rug::{
float::{Constant, Round},
Assign, Float, Integer,
};
fn decimal_string(val: &Float, prec: i32) -> String {
let log10 = val.clone().log10();
let floor_log10 = log10.to_i32_saturating_round(Round::Down).unwrap();
let shift = u32::try_from(prec - 1 - floor_log10).unwrap();
let val = val.clone() * Integer::from(Integer::u_pow_u(10, shift));
let int = val.to_integer_round(Round::Down).unwrap().0;
let padding = "0".repeat(usize::try_from(-floor_log10.min(0)).unwrap());
let mut s = format!("{}{}", padding, int);
s.insert(1, '.');
s
}
fn hex_bits(val: &Float, frac_bits: i32) -> String {
let val = val.clone() << frac_bits;
let int = val.to_integer_round(Round::Down).unwrap().0;
let mut s = format!("0x{:016X}", int);
for i in 0..7 {
s.insert(6 + 5 * i, '_');
}
s
}
fn print(doc: &str, name: &str, val: Float) {
println!("/// {} = {}", doc, decimal_string(&val, 6));
println!("// {} = {}...", name, decimal_string(&val, 40));
let int_bits = val.get_exp().unwrap().max(0);
let frac_bits = 128 - int_bits;
print!("pub const {}: U{}F{} = U{1}F{2}", name, int_bits, frac_bits,);
println!("::from_bits({});", hex_bits(&val, frac_bits));
println!();
}
fn float<T>(t: T) -> Float
where
Float: Assign<T>,
{
Float::with_val(200, t)
}
fn main() {
print("τ", "TAU", float(Constant::Pi) * 2);
print("τ/2", "FRAC_TAU_2", float(Constant::Pi));
print("τ/3", "FRAC_TAU_3", float(Constant::Pi) * 2 / 3);
print("τ/4", "FRAC_TAU_4", float(Constant::Pi) / 2);
print("τ/6", "FRAC_TAU_6", float(Constant::Pi) / 3);
print("τ/8", "FRAC_TAU_8", float(Constant::Pi) / 4);
print("τ/12", "FRAC_TAU_12", float(Constant::Pi) / 6);
print("1/τ", "FRAC_1_TAU", 0.5 / float(Constant::Pi));
print("2/τ", "FRAC_2_TAU", 1 / float(Constant::Pi));
print("4/τ", "FRAC_4_TAU", 2 / float(Constant::Pi));
print("π", "PI", float(Constant::Pi));
print("π/2", "FRAC_PI_2", float(Constant::Pi) / 2);
print("π/3", "FRAC_PI_3", float(Constant::Pi) / 3);
print("π/4", "FRAC_PI_4", float(Constant::Pi) / 4);
print("π/6", "FRAC_PI_6", float(Constant::Pi) / 6);
print("π/8", "FRAC_PI_8", float(Constant::Pi) / 8);
print("1/π", "FRAC_1_PI", 1 / float(Constant::Pi));
print("2/π", "FRAC_2_PI", 2 / float(Constant::Pi));
print("2/√π", "FRAC_2_SQRT_PI", 2 / float(Constant::Pi).sqrt());
print("√2", "SQRT_2", float(2).sqrt());
print("1/√2", "FRAC_1_SQRT_2", float(0.5).sqrt());
print("e", "E", float(1).exp());
print("log<sub>2</sub> 10", "LOG2_10", float(10).log2());
print("log<sub>2</sub> e", "LOG2_E", float(1).exp().log2());
print("log<sub>10</sub> 2", "LOG10_2", float(2).log10());
print("log<sub>10</sub> e", "LOG10_E", float(1).exp().log10());
print("ln 2", "LN_2", float(2).ln());
print("ln 10", "LN_10", float(10).ln());
}
```
*/
/// τ = 6.28318…
// TAU = 6.283185307179586476925286766559005768394...
pub const TAU: U3F125 = U3F125::from_bits(0xC90F_DAA2_2168_C234_C4C6_628B_80DC_1CD1);