use ferrunitas::common::{format_dims, format_unit_dims};
use ferrunitas::system::*;
use ferrunitas::{
Measure, Unit,
typenum_consts::{N1, P1},
unit,
};
fn dimensions() {
println!("=== Dimensional Introspection ===");
println!("Force dimensions: {}", format_dims::<Force>());
println!("Acceleration dimensions: {}", format_dims::<Acceleration>());
println!("Entropy dimensions: {}", format_dims::<Entropy>());
println!();
println!("MetrePerSecond dimensions: {}", format_unit_dims::<MetrePerSecond>());
println!("Farad dimensions: {}", format_unit_dims::<Farad>());
println!("MolePerLitre dimensions: {}", format_unit_dims::<MolePerLitre>());
}
fn demonstrate_large_number_precision_issues() {
println!("\n=== Large Number Precision Caveats ===");
println!("--- Prefix Precision Issues ---");
let yobibyte_data = Yobibyte::new(1.0);
let bit_data = yobibyte_data.convert::<Bit>();
println!("1 Yobibyte = {:.0} bits", bit_data.value());
println!("Expected = {:.0} bits", (1u128 << 80) as f64 * 8.0);
let yottabyte_data = Yottabyte::new(1.0);
let bit_data = yottabyte_data.convert::<Bit>();
println!("1 Yottabyte = {:.0} bits", bit_data.value());
println!("Expected = {:.0} bits", 10u128.pow(24) * 8);
println!("\n--- Arithmetic Precision Loss ---");
let large_data = Exabyte::new(1000.0); let small_data = Byte::new(1.0); let sum = large_data + small_data;
println!("1000 Exabytes + 1 Byte:");
println!("Result = {:.0} bytes", sum.convert::<Byte>().value());
println!("Expected = {:.0} bytes", 10u128.pow(21) + 1);
}
fn offest_limited_usage() {
println!("\n=== Offset Units Limited Usage ===");
let temp_c = DegreeCelsius::new(25.0);
let temp_f: Measure<DegreeFahrenheit> = temp_c.convert();
println!("{:.2} == {:.2}", temp_c, temp_f);
let temp_c2 = DegreeCelsius::new(30.0);
let temp_f2 = DegreeFahrenheit::new(14.0);
let delta_temp = temp_c2 - temp_f2;
let delta_k = delta_temp.convert::<Kelvin>();
println!("Temperature difference: {:.2} K", delta_k.value());
unit!(compound: JoulePerFahrenheit, "J/°F", [(Joule, P1), (DegreeFahrenheit, N1)]);
let jpk = JoulePerKelvin::new(2.0);
let jpf = jpk.convert::<JoulePerFahrenheit>();
println!("{:.2} == {:.2}", jpk, jpf);
}
#[cfg(feature = "quantity_tags")]
fn quantity_tags() {
let a = SquareMetre::new(1.0);
let b = SquareMetre::new(4.0);
let c = Steradian::new(1.0);
let result = (a / b).specify::<SolidAngle>() + c;
println!("{} / {} + {} = {}", a, b, c, result);
let a = Bit::new(1.0);
let b = Radian::new(1.0);
let result = a.into_q().specify::<Dimensionless>() + b.into_q().specify::<Dimensionless>();
println!("{} + {} = {}", a, b, result);
}
#[cfg(not(feature = "quantity_tags"))]
fn quantity_tags() {
let a = SquareMetre::new(1.0);
let b = SquareMetre::new(4.0);
let c = Steradian::new(1.0);
let result = (a / b) + c;
println!("{} / {} + {} = {}", a, b, c, result);
let a = Bit::new(1.0);
let b = Radian::new(1.0);
let result1 = a + b;
let result2 = a.into_q() + b.into_q();
println!("{} + {} = {} = {}", a, b, result1, result2);
}
fn main() {
dimensions();
demonstrate_large_number_precision_issues();
offest_limited_usage();
quantity_tags();
}