fn from()

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)
    }