use super::PhysicalConstant;
pub const SPEED_OF_LIGHT: PhysicalConstant = PhysicalConstant {
value: 299_792_458.0,
uncertainty: 0.0,
unit: "m/s",
symbol: "c",
name: "Speed of light in vacuum",
};
pub const PLANCK_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 6.626_070_15e-34,
uncertainty: 0.0,
unit: "J s",
symbol: "h",
name: "Planck constant",
};
pub const REDUCED_PLANCK_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 1.054_571_817_646_156_4e-34,
uncertainty: 0.0,
unit: "J s",
symbol: "\u{0127}", name: "Reduced Planck constant",
};
pub const ELEMENTARY_CHARGE: PhysicalConstant = PhysicalConstant {
value: 1.602_176_634e-19,
uncertainty: 0.0,
unit: "C",
symbol: "e",
name: "Elementary charge",
};
pub const BOLTZMANN_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 1.380_649e-23,
uncertainty: 0.0,
unit: "J/K",
symbol: "k_B",
name: "Boltzmann constant",
};
pub const AVOGADRO_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 6.022_140_76e23,
uncertainty: 0.0,
unit: "mol^-1",
symbol: "N_A",
name: "Avogadro constant",
};
pub const GRAVITATIONAL_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 6.674_30e-11,
uncertainty: 1.5e-15,
unit: "m^3 kg^-1 s^-2",
symbol: "G",
name: "Newtonian constant of gravitation",
};
pub const FINE_STRUCTURE_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 7.297_352_564_3e-3,
uncertainty: 1.1e-12,
unit: "",
symbol: "\u{03B1}", name: "Fine-structure constant",
};
pub const ELECTRON_MASS: PhysicalConstant = PhysicalConstant {
value: 9.109_383_713_9e-31,
uncertainty: 2.8e-40,
unit: "kg",
symbol: "m_e",
name: "Electron mass",
};
pub const PROTON_MASS: PhysicalConstant = PhysicalConstant {
value: 1.672_621_925_95e-27,
uncertainty: 5.2e-37,
unit: "kg",
symbol: "m_p",
name: "Proton mass",
};
pub const NEUTRON_MASS: PhysicalConstant = PhysicalConstant {
value: 1.674_927_500_56e-27,
uncertainty: 8.5e-37,
unit: "kg",
symbol: "m_n",
name: "Neutron mass",
};
pub const ELECTRON_CHARGE_MASS_RATIO: PhysicalConstant = PhysicalConstant {
value: -1.758_820_010_76e11,
uncertainty: 5.3e1,
unit: "C/kg",
symbol: "-e/m_e",
name: "Electron charge-to-mass ratio",
};
pub const ATOMIC_MASS_UNIT: PhysicalConstant = PhysicalConstant {
value: 1.660_539_068_92e-27,
uncertainty: 5.2e-37,
unit: "kg",
symbol: "u",
name: "Unified atomic mass unit",
};
pub const STEFAN_BOLTZMANN_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 5.670_374_419_184_429_5e-8,
uncertainty: 0.0,
unit: "W m^-2 K^-4",
symbol: "\u{03C3}", name: "Stefan-Boltzmann constant",
};
pub const GAS_CONSTANT: PhysicalConstant = PhysicalConstant {
value: 8.314_462_618_153_24,
uncertainty: 0.0,
unit: "J mol^-1 K^-1",
symbol: "R",
name: "Molar gas constant",
};
#[cfg(test)]
#[allow(clippy::assertions_on_constants)]
mod tests {
use super::*;
const EPSILON: f64 = 1e-6;
#[test]
fn test_speed_of_light_value() {
assert_eq!(SPEED_OF_LIGHT.value, 299_792_458.0);
assert!(SPEED_OF_LIGHT.is_exact());
}
#[test]
fn test_planck_constant_value() {
let expected = 6.626_070_15e-34;
assert!((PLANCK_CONSTANT.value - expected).abs() < 1e-42);
assert!(PLANCK_CONSTANT.is_exact());
}
#[test]
fn test_reduced_planck_constant_derived() {
let expected = PLANCK_CONSTANT.value / (2.0 * std::f64::consts::PI);
let relative_error = ((REDUCED_PLANCK_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < 1e-15,
"hbar derivation error: {}",
relative_error
);
}
#[test]
fn test_elementary_charge_value() {
assert_eq!(ELEMENTARY_CHARGE.value, 1.602_176_634e-19);
assert!(ELEMENTARY_CHARGE.is_exact());
}
#[test]
fn test_boltzmann_constant_value() {
assert_eq!(BOLTZMANN_CONSTANT.value, 1.380_649e-23);
assert!(BOLTZMANN_CONSTANT.is_exact());
}
#[test]
fn test_avogadro_constant_value() {
assert_eq!(AVOGADRO_CONSTANT.value, 6.022_140_76e23);
assert!(AVOGADRO_CONSTANT.is_exact());
}
#[test]
fn test_gravitational_constant_value() {
let expected = 6.674_30e-11;
assert!((GRAVITATIONAL_CONSTANT.value - expected).abs() < 1e-15);
assert!(!GRAVITATIONAL_CONSTANT.is_exact());
assert!(GRAVITATIONAL_CONSTANT.uncertainty > 0.0);
}
#[test]
fn test_fine_structure_constant_value() {
let expected = 7.297_352_564_3e-3;
assert!((FINE_STRUCTURE_CONSTANT.value - expected).abs() < 1e-12);
let inv_alpha = 1.0 / FINE_STRUCTURE_CONSTANT.value;
assert!((inv_alpha - 137.036).abs() < 0.001);
}
#[test]
fn test_electron_mass_value() {
let expected = 9.109_383_713_9e-31;
assert!((ELECTRON_MASS.value - expected).abs() < 1e-40);
}
#[test]
fn test_proton_mass_value() {
let expected = 1.672_621_925_95e-27;
assert!((PROTON_MASS.value - expected).abs() < 1e-37);
}
#[test]
fn test_neutron_mass_value() {
let expected = 1.674_927_500_56e-27;
assert!((NEUTRON_MASS.value - expected).abs() < 1e-37);
}
#[test]
fn test_proton_heavier_than_electron() {
let ratio = PROTON_MASS.value / ELECTRON_MASS.value;
assert!((ratio - 1836.15).abs() < 0.1);
}
#[test]
fn test_neutron_heavier_than_proton() {
assert!(NEUTRON_MASS.value > PROTON_MASS.value);
let diff = NEUTRON_MASS.value - PROTON_MASS.value;
assert!(diff > 0.0);
assert!(diff < 1e-27);
}
#[test]
fn test_electron_charge_mass_ratio() {
let expected = ELEMENTARY_CHARGE.value / ELECTRON_MASS.value;
let actual = ELECTRON_CHARGE_MASS_RATIO.value.abs();
let relative_error = ((actual - expected) / expected).abs();
assert!(relative_error < EPSILON, "e/m_e error: {}", relative_error);
}
#[test]
fn test_gas_constant_derived() {
let expected = AVOGADRO_CONSTANT.value * BOLTZMANN_CONSTANT.value;
let relative_error = ((GAS_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < 1e-12,
"R derivation error: {}",
relative_error
);
}
#[test]
fn test_stefan_boltzmann_derived() {
let pi = std::f64::consts::PI;
let k = BOLTZMANN_CONSTANT.value;
let h = PLANCK_CONSTANT.value;
let c = SPEED_OF_LIGHT.value;
let expected = 2.0 * pi.powi(5) * k.powi(4) / (15.0 * h.powi(3) * c.powi(2));
let relative_error = ((STEFAN_BOLTZMANN_CONSTANT.value - expected) / expected).abs();
assert!(
relative_error < 1e-10,
"Stefan-Boltzmann derivation error: {}",
relative_error
);
}
#[test]
fn test_atomic_mass_unit_value() {
let expected = 1.660_539_068_92e-27;
assert!((ATOMIC_MASS_UNIT.value - expected).abs() < 1e-37);
}
#[test]
fn test_all_units_nonempty() {
assert!(!SPEED_OF_LIGHT.unit.is_empty());
assert!(!PLANCK_CONSTANT.unit.is_empty());
assert!(!ELEMENTARY_CHARGE.unit.is_empty());
assert!(!BOLTZMANN_CONSTANT.unit.is_empty());
assert!(!AVOGADRO_CONSTANT.unit.is_empty());
assert!(!GRAVITATIONAL_CONSTANT.unit.is_empty());
assert!(!ELECTRON_MASS.unit.is_empty());
assert!(!GAS_CONSTANT.unit.is_empty());
assert!(FINE_STRUCTURE_CONSTANT.unit.is_empty());
}
#[test]
fn test_all_names_nonempty() {
assert!(!SPEED_OF_LIGHT.name.is_empty());
assert!(!PLANCK_CONSTANT.name.is_empty());
assert!(!REDUCED_PLANCK_CONSTANT.name.is_empty());
assert!(!ELEMENTARY_CHARGE.name.is_empty());
assert!(!BOLTZMANN_CONSTANT.name.is_empty());
assert!(!AVOGADRO_CONSTANT.name.is_empty());
assert!(!GRAVITATIONAL_CONSTANT.name.is_empty());
assert!(!FINE_STRUCTURE_CONSTANT.name.is_empty());
assert!(!ELECTRON_MASS.name.is_empty());
assert!(!PROTON_MASS.name.is_empty());
assert!(!NEUTRON_MASS.name.is_empty());
assert!(!ELECTRON_CHARGE_MASS_RATIO.name.is_empty());
assert!(!ATOMIC_MASS_UNIT.name.is_empty());
assert!(!STEFAN_BOLTZMANN_CONSTANT.name.is_empty());
assert!(!GAS_CONSTANT.name.is_empty());
}
#[test]
fn test_exact_constants_zero_uncertainty() {
let exact_constants = [
&SPEED_OF_LIGHT,
&PLANCK_CONSTANT,
&REDUCED_PLANCK_CONSTANT,
&ELEMENTARY_CHARGE,
&BOLTZMANN_CONSTANT,
&AVOGADRO_CONSTANT,
&STEFAN_BOLTZMANN_CONSTANT,
&GAS_CONSTANT,
];
for c in &exact_constants {
assert_eq!(
c.uncertainty, 0.0,
"{} should be exact but has uncertainty {}",
c.name, c.uncertainty
);
}
}
#[test]
fn test_nonexact_constants_positive_uncertainty() {
let nonexact_constants = [
&GRAVITATIONAL_CONSTANT,
&FINE_STRUCTURE_CONSTANT,
&ELECTRON_MASS,
&PROTON_MASS,
&NEUTRON_MASS,
&ATOMIC_MASS_UNIT,
];
for c in &nonexact_constants {
assert!(
c.uncertainty > 0.0,
"{} should have positive uncertainty",
c.name
);
}
}
}