use crate::epoch::TAI_TT_OFFSET;
use crate::{SecondsSince, TAI, TT};
pub fn tai_to_tt(tai_seconds: f64) -> f64 {
tai_seconds + TAI_TT_OFFSET
}
pub fn tt_to_tai(tt_seconds: f64) -> f64 {
tt_seconds - TAI_TT_OFFSET
}
pub fn tai_to_tt_typed(t: SecondsSince<TAI>) -> SecondsSince<TT> {
SecondsSince::from_seconds(tai_to_tt(t.as_seconds()))
}
pub fn tt_to_tai_typed(t: SecondsSince<TT>) -> SecondsSince<TAI> {
SecondsSince::from_seconds(tt_to_tai(t.as_seconds()))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tai_tt_exact_offset() {
assert_eq!(tai_to_tt(0.0), 32.184);
assert_eq!(tai_to_tt(100.0), 132.184);
assert_eq!(tt_to_tai(32.184), 0.0);
}
#[test]
fn tai_tt_round_trip() {
let tai = 123456.789;
let tt = tai_to_tt(tai);
let back = tt_to_tai(tt);
assert!((back - tai).abs() < 1e-15);
}
#[test]
fn tai_tt_typed_matches_f64() {
let tai_raw = 1_000_000.0_f64;
let tt_typed = tai_to_tt_typed(SecondsSince::<TAI>::from_seconds(tai_raw));
assert_eq!(tt_typed.as_seconds(), tai_to_tt(tai_raw));
}
#[test]
fn tai_tt_typed_round_trip() {
let tai = SecondsSince::<TAI>::from_seconds(1_000_000.0);
let tt = tai_to_tt_typed(tai);
let back = tt_to_tai_typed(tt);
let err = (back.as_seconds() - tai.as_seconds()).abs();
assert!(err < 1e-14, "round-trip err={} (tolerance 1e-14 s)", err);
}
}