Add constants for f16 and f128 by tspiteri · Pull Request #123850 · rust-lang/rust (original) (raw)
This is my code below. Should I include the code in a comment in f128.rs?
use rug:🛟:Constant; use rug::{Assign, Float};
fn decimal_string(val: &Float, num_digits: usize) -> String { let (sign, mut digits, exp) = val.to_sign_string_exp(10, Some(num_digits)); if let Some(exp) = exp { if exp <= 0 { let one_minus_exp = usize::try_from(1 - exp).unwrap(); digits.insert_str(0, &"0".repeat(one_minus_exp)); digits.insert(1, '.'); } else { let exp = usize::try_from(exp).unwrap(); if exp >= num_digits { digits.push_str(&"0".repeat(exp - num_digits)); } else { digits.insert(exp, '.'); } } } if sign { digits.insert(0, '-'); } digits }
fn float(t: T) -> Float where Float: Assign, { Float::with_val(1000, t) }
fn print(name: &str, f: Float) { let s = decimal_string(&f, 60); assert_eq!( Float::with_val(113, Float::parse(&s).unwrap()), Float::with_val(113, &f) ); println!("pub const {name}: f128 = {s}_f128;"); }
fn main() { print("PI", float(Constant::Pi)); print("TAU", float(Constant::Pi) * 2); print("PHI", float(1.25).sqrt() + 0.5); print("EGAMMA", float(Constant::Euler)); print("FRAC_PI_2", float(Constant::Pi) / 2); print("FRAC_PI_3", float(Constant::Pi) / 3); print("FRAC_PI_4", float(Constant::Pi) / 4); print("FRAC_PI_6", float(Constant::Pi) / 6); print("FRAC_PI_8", float(Constant::Pi) / 8); print("FRAC_1_PI", float(Constant::Pi).recip()); print("FRAC_1_SQRT_PI", float(Constant::Pi).sqrt().recip()); print("FRAC_2_PI", 2 / float(Constant::Pi)); print("FRAC_2_SQRT_PI", 2 / float(Constant::Pi).sqrt()); print("SQRT_2", float(2).sqrt()); print("FRAC_1_SQRT_2", float(0.5).sqrt()); print("SQRT_3", float(3).sqrt()); print("FRAC_1_SQRT_3", float(3).sqrt().recip()); print("E", float(1).exp()); print("LOG2_10", float(10).log2()); print("LOG2_E", float(1).exp().log2()); print("LOG10_2", float(2).log10()); print("LOG10_E", float(1).exp().log10()); print("LN_2", float(2).ln()); print("LN_10", float(10).ln()); }