use super::{F32Like, LikeF32};
use crate::double::NormDouble;
const SQRT_2: u32 = 0x3FB504F3; const LN_2_HI: u32 = 0x3F317000; const LN_2_LO: u32 = 0x3805FDF4; const FRAC_2_3_HI: u32 = 0x3F2AAAAA; const FRAC_2_3_LO: u32 = 0x332AAAAB; const FRAC_4_10_HI: u32 = 0x3ECCCCCC; const FRAC_4_10_LO: u32 = 0x32CCCCCD;
impl<F: F32Like> crate::generic::Log<LikeF32> for F {
#[inline]
fn sqrt_2() -> Self {
Self::from_raw(SQRT_2)
}
#[inline]
fn ln_2_hi() -> Self {
Self::from_raw(LN_2_HI)
}
#[inline]
fn ln_2_lo() -> Self {
Self::from_raw(LN_2_LO)
}
#[inline]
fn frac_2_3_ex() -> NormDouble<Self> {
NormDouble::with_parts(Self::from_raw(FRAC_2_3_HI), Self::from_raw(FRAC_2_3_LO))
}
#[inline]
fn frac_4_10_ex() -> NormDouble<Self> {
NormDouble::with_parts(Self::from_raw(FRAC_4_10_HI), Self::from_raw(FRAC_4_10_LO))
}
#[inline]
fn log_special_poly(x: Self) -> Self {
const K2: u32 = 0x3F2AAAAA; const K4: u32 = 0x3ECCCD3D; const K6: u32 = 0x3E921C64; const K8: u32 = 0x3E717C5F;
let k2 = Self::from_raw(K2);
let k4 = Self::from_raw(K4);
let k6 = Self::from_raw(K6);
let k8 = Self::from_raw(K8);
let x2 = x * x;
horner!(x2, x2, [k2, k4, k6, k8])
}
#[inline]
fn log_special_poly_ex(x2: Self) -> Self {
const K6: u32 = 0x3E92495E; const K8: u32 = 0x3E634F16; const K10: u32 = 0x3E454D62;
let k6 = Self::from_raw(K6);
let k8 = Self::from_raw(K8);
let k10 = Self::from_raw(K10);
horner!(x2, x2, [k6, k8, k10])
}
}