use super::{F64Like, LikeF64};
use crate::double::NormDouble;
const SQRT_2: u64 = 0x3FF6A09E667F3BCD; const LN_2_HI: u64 = 0x3FE62E42F8000000; const LN_2_LO: u64 = 0x3E4BE8E7BCD5E4F2; const FRAC_2_3_HI: u64 = 0x3FE5555555555555; const FRAC_2_3_LO: u64 = 0x3C85555555555555; const FRAC_4_10_HI: u64 = 0x3FD9999999999999; const FRAC_4_10_LO: u64 = 0x3C83333333333333;
impl<F: F64Like> crate::generic::Log<LikeF64> 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: u64 = 0x3FE5555555555592; const K4: u64 = 0x3FD999999997FCEC; const K6: u64 = 0x3FD24924941FD4B4; const K8: u64 = 0x3FCC71C51FED1022; const K10: u64 = 0x3FC7466413417D8C; const K12: u64 = 0x3FC39A17C3B61C8B; const K14: u64 = 0x3FC2F07F8A21D5D4;
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 k10 = Self::from_raw(K10);
let k12 = Self::from_raw(K12);
let k14 = Self::from_raw(K14);
let x2 = x * x;
horner!(x2, x2, [k2, k4, k6, k8, k10, k12, k14])
}
#[inline]
fn log_special_poly_ex(x2: Self) -> Self {
const K6: u64 = 0x3FD24924924812EE; const K8: u64 = 0x3FCC71C71F9F60BA; const K10: u64 = 0x3FC745CF9D840A43; const K12: u64 = 0x3FC3B1C4894C673B; const K14: u64 = 0x3FC0FB8E8D66F0D4; const K16: u64 = 0x3FC0C54412F0DDDB;
let k6 = Self::from_raw(K6);
let k8 = Self::from_raw(K8);
let k10 = Self::from_raw(K10);
let k12 = Self::from_raw(K12);
let k14 = Self::from_raw(K14);
let k16 = Self::from_raw(K16);
horner!(x2, x2, [k6, k8, k10, k12, k14, k16])
}
}