use super::{F64Like, LikeF64};
use crate::double::SemiDouble;
const CBRT_2_HI: u64 = 0x3FF428A2F8000000; const CBRT_2_LO: u64 = 0x3E38D728AE223DDB; const CBRT_4_HI: u64 = 0x3FF965FEA0000000; const CBRT_4_LO: u64 = 0x3E54F5B8F20AC166;
impl<F: F64Like> crate::generic::Cbrt<LikeF64> for F {
#[inline]
fn cbrt_2_ex() -> SemiDouble<Self> {
SemiDouble::with_parts(Self::from_raw(CBRT_2_HI), Self::from_raw(CBRT_2_LO))
}
#[inline]
fn cbrt_4_ex() -> SemiDouble<Self> {
SemiDouble::with_parts(Self::from_raw(CBRT_4_HI), Self::from_raw(CBRT_4_LO))
}
#[inline]
fn exp_mod_3(e: i16) -> i8 {
(((e + 1077) as u16) % 3) as i8
}
#[inline]
fn inv_cbrt_poly(x: Self) -> Self {
const K0: u64 = 0x3FFC880B69FCA3C8; const K1: u64 = 0xBFF92D75CD846C60; const K2: u64 = 0x3FF4116F47A08958; const K3: u64 = 0xBFE35C39AE807700; const K4: u64 = 0x3FC448AC781671FD; const K5: u64 = 0xBF91C0A9E3B225C5;
let k0 = Self::from_raw(K0);
let k1 = Self::from_raw(K1);
let k2 = Self::from_raw(K2);
let k3 = Self::from_raw(K3);
let k4 = Self::from_raw(K4);
let k5 = Self::from_raw(K5);
k0 + horner!(x, x, [k1, k2, k3, k4, k5])
}
}