in chrony-candm/src/common.rs [261:308]
fn from(f: f64) -> Self {
let (neg, x) = if f < 0. {
(1, -f)
} else if f >= 0. {
(0, f)
} else {
(0, 0.) //Treat NaN as zero
};
let mut exp: i32;
let mut coef: i32;
if x < 1e-100 {
coef = 0;
exp = 0;
} else if x > 1e100 {
coef = FLOAT_COEF_MAX + neg;
exp = FLOAT_EXP_MAX;
} else {
exp = x.log2() as i32 + 1;
coef = (x * 2.0f64.powi(-exp + FLOAT_COEF_BITS as i32) + 0.5) as i32;
debug_assert!(coef > 0);
while coef > FLOAT_COEF_MAX + neg {
coef >>= 1;
exp += 1;
}
if exp > FLOAT_EXP_MAX {
exp = FLOAT_EXP_MAX;
coef = FLOAT_COEF_MAX + neg;
} else if exp < FLOAT_EXP_MIN {
if exp + FLOAT_COEF_BITS as i32 >= FLOAT_EXP_MIN {
coef >>= FLOAT_EXP_MIN - exp;
exp = FLOAT_EXP_MIN;
} else {
exp = 0;
coef = 0;
}
}
};
if neg != 0 {
coef = ((-coef as u32) << FLOAT_EXP_BITS >> FLOAT_EXP_BITS) as i32;
}
ChronyFloat((exp as u32) << FLOAT_COEF_BITS | coef as u32)
}